我有一个已提供给客户的服务表。我正在尝试创建一个查询,选择所有收到某个用户未提供服务的客户端。
所以考虑一下这个表......
id_client | id_service | id_user
--------------------------------
5 | 3 | 2
7 | 4 | 2
7 | 4 | 1
9 | 4 | 2
8 | 4 | 1
如果我写这样的查询:
SELECT id_client FROM table WHERE id_service=4 AND id_user<>1
我仍然最终获得id_client 7.但我不想获得客户端7,因为该客户端已从用户1收到该服务。(他们出现因为他们也从用户2收到了该服务)
在上面的示例中,我只想与客户端9一起返回
如何编写查询以确保从用户1收到服务4的客户端未显示?
答案 0 :(得分:3)
试试这个:
SELECT DISTINCT id_client
FROM yourtable t
WHERE id_service = 4 AND id_client NOT IN
(SELECT DISTINCT id_client
FROM yourtable t
WHERE id_user = 1
)
答案 1 :(得分:2)
我会这样写:
SELECT DISTINCT id_client
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON t1.id_client = t2.id_client AND t2.id_user = 1
WHERE t2.id_client IS NULL
当不满足左外连接的条件时,仍会返回左侧的行,右侧的行的所有列都为空。因此,如果您在列中搜索null的情况,如果存在匹配,则肯定会为非null,您知道外部联接找不到匹配项。
答案 2 :(得分:1)
SELECT id_client
FROM table
WHERE id_service = 4
GROUP BY id_client
HAVING MAX(CASE
WHEN id_user = 1 THEN 2
ELSE 1
END) = 1