比较两个表的服务,并仅显示未分配给用户1的那些服务

表1:服务

id | Service
--------------
1  | service 1
--------------
2  | service 2
--------------
3  | service 3
--------------
4  | service 4
--------------
5  | service 5


表2:分配的服务

id | services | assign_to | date
--------------------------------------
1  | service 1| 1         | 20/12/2019
--------------------------------------
2  | service 2| 1         | 20/12/2019
--------------------------------------
3  | service 1| 2         | 20/12/2019
--------------------------------------
3  | service 3| 1         | 20/12/2019
--------------------------------------
3  | service 2| 2         | 20/12/2019


我尝试左右加入喜欢

SELECT a.x, a.y
FROM table_a a LEFT JOIN table_b b
ON a.x = b.x AND a.y = b.y
WHERE b.x IS NULL;

最佳答案

通过在分配给用户1的服务上使用LEFT JOIN并检查NULL结果,可以找到未分配给用户1的服务(包括未分配给任何用户的服务):

SELECT s.id, s.service
FROM services s
LEFT JOIN assignments a ON a.services = s.service AND a.assign_to = 1
WHERE a.id IS NULL


输出:

id  service
4   service 4
5   service 5


如果希望将所有已分配给任何用户或除1之外的用户的服务(即使它们也已分配给1),则可以使用以下查询:

SELECT s.id, s.service
FROM services s
LEFT JOIN assignments a ON a.services = s.service
GROUP BY s.id, s.service
HAVING SUM(a.assign_to != 1) > 0
    OR SUM(a.assign_to) IS NULL


输出量

id  service
1   service 1
2   service 2
4   service 4
5   service 5


Demo on dbfiddle

10-08 04:42
查看更多