簡體   English   中英

選擇所有連接的行都匹配的記錄

[英]Selecting records where all joined rows match

給定以下架構:

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 ),不應返回Bob。

使用條件聚合:

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

以下應該工作:

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;

您可以使用聚合獲取員工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;

有關完整信息,可以使用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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM