我如何使用SQL实现这一目标?

时间:2012-01-15 15:47:52

标签: mysql sql join

我的数据库中有2个表,如下所示:

clients
+-------------+
| id   | sms  |
|------+------|
| 1    | 0    |
| 2    | 1    |
| 3    | 1    |
| 4    | 1    |
+------+------+

clients_lists_relationships
+----------------------+
| listid   | clientid  |
|----------+-----------|
| 1        | 1         |
| 1        | 2         |
| 2        | 1         |
| 3        | 1         |
+----------+-----------+

现在我要做的是获取一系列列表中的客户列表。我这样做是这样的:

SELECT c.id, 
       l.* 
FROM   clients AS c, 
       clients_lists_relationships AS l 
WHERE  c.id = l.clientid 
       AND c.sms = '1' 
       AND ( l.listid = '1' 
              OR l.listid = '2' );

这确实给了我一个我需要的客户列表。但是因为客户端可以在多个列表中,所以我不止一次获得同一个客户端。对于每个客户端,无论它们有多少列表,我如何将其限制为仅一行?

4 个答案:

答案 0 :(得分:3)

如果您只需要列表中的任何客户端,您只需查询关系表:

SELECT DSITINCT(clientid) FROM clients_lists_relationships

您也可以在合并后的查询中使用那个不同的内容,但请注意,您将获得的“listid”只是一个。

答案 1 :(得分:2)

首先看一下MySQL:: JOIN它比你现在使用的WHERE语句要好得多。

我认为你正在寻找GROUP BY。

总的来说,查询看起来像:

SELECT 
    c.id, 
    l.* 
FROM   
    clients AS c
INNER JOIN
    clients_lists_relationships AS l
    ON
        l.clientid = c.id 
    AND
        c.sms = '1' 
    AND
        ( l.listid = '1' 
        OR l.listid = '2' );
GROUP BY
    c.id

答案 2 :(得分:2)

使用GROUP BY

SELECT c.id, 
       l.listid
FROM clients c
INNER JOIN clients_lists_relationships l
ON c.id = l.clientid
WHERE  c.sms = 1
       AND l.listid IN (1,2)
GROUP BY c.id

请注意,通过执行此操作,您将丢失有关客户端所属列表的信息。这意味着您可能无法从client_lists_relationships中选择任何内容,因为此信息可能是多余的(clientid)或不完整的(listid)。

答案 3 :(得分:0)

要仅返回参与多个列表的客户,您可能需要考虑使用HAVING子句:

SELECT c.id
  FROM Clients c
 INNER JOIN Client_Lists_Relationships l
         ON l.clientid = c.id
 WHERE c.sms = 1
HAVING COUNT(L.listid) > 1
GROUP BY c.id