选择那些从未有过某些条目的人

时间:2011-09-22 16:03:38

标签: mysql

我有一个已提供给客户的服务表。我正在尝试创建一个查询,选择所有收到某个用户未提供服务的客户端。

所以考虑一下这个表......

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的客户端未显示?

3 个答案:

答案 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