我的数据库中有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' );
这确实给了我一个我需要的客户列表。但是因为客户端可以在多个列表中,所以我不止一次获得同一个客户端。对于每个客户端,无论它们有多少列表,我如何将其限制为仅一行?
答案 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