2017-01-09 96 views
0

考慮下面的模式選擇記錄:所有加盟相匹配的行

employees 
id | name 

employee_attributes 
id | employee_id | key | value 

我想選擇具有所提供的屬性,所有員工。

下面的語句的工作原理:

SELECT employees.* FROM employees 
INNER JOIN employee_attributes ON employee_attributes.employee_id = employees.id 
WHERE employee_attributes.key = 'foo' AND employee_attributes.value = 'bar' 

,但只允許我用一個屬性來查找僱員。我如何適應這一點,以通過多個屬性檢索員工?

要清楚,如果我提供套的屬性來匹配的,查詢應只返回具有至少這兩個屬性員工。

例如,如果Bob,只有一個屬性:

key | value 
=========== 
foo | bar 

但我提供兩個屬性查詢(foobarbinbaz),鮑勃應該不予退還。

回答

0

使用條件彙總:

SELECT employees.* 
FROM employees 
INNER JOIN employee_attributes 
    ON employee_attributes.employee_id = employees.id 
GROUP BY employee_attributes.employee_id 
HAVING SUM(CASE WHEN employee_attributes.key = 'foo' AND 
        employee_attributes.value = 'bar' THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN employee_attributes.key = 'bin' AND 
        employee_attributes.value = 'baz' THEN 1 ELSE 0 END) > 0 
+0

這會使員工只返回一個鍵值對。 –

+0

@DarshanMehta我更新了我的答案。 –

0

下面應該工作:

SELECT employees.id, employees.name, count(employee_attributes.id) as attribute_count FROM employees 
INNER JOIN employee_attributes ON employee_attributes.employee_id = employees.id 
WHERE (employee_attributes.key = 'foo' AND employee_attributes.value = 'bar') OR (employee_attributes.key = 'bin' AND employee_attributes.value = 'baz') 
group by employees.id, employees.name 
having attribute_count >= 2; 
0

可以使用聚合得到員工ID:

SELECT ea.employee_id 
FROM employee_attributes.employee_id 
WHERE (ea.key = 'foo' AND ea.value = 'bar') OR 
     (ea.key = 'bin' AND ea.value = 'baz') 
GROUP BY ea.employee_id 
HAVING COUNT(DISTINCT ea.key) = 2; 

有關完整信息,您可以使用a JOIN

SELECT e.* 
FROM employee e JOIN 
    (SELECT ea.employee_id 
     FROM employee_attributes.employee_id 
     WHERE (ea.key = 'foo' AND ea.value = 'bar') OR 
      (ea.key = 'bin' AND ea.value = 'baz') 
     GROUP BY ea.employee_id 
     HAVING COUNT(DISTINCT ea.key) = 2 
    ) ea 
    ON ea.employee_id = e.id; 
相關問題