我正在尝试创建查询,但我不知道如何。
我有三个表:chat
,chat_user
和user
类似的东西:
--------- ------------------------ ------------------
| chat | | chat_user | | user |
--------- ------------------------ ------------------
| id | 1 | | id | chat_id | user_id | | id | external_id |
---- ---- ---- --------- --------- ---- -------------
| 1 | 1 | 1 | | 1 | 111 |
| 2 | 1 | 2 | | 2 | 222 |
---- --------- --------- ---- -------------
我需要为两个user
选择一个chat.id。在上面的示例中,用户111和222正在共享chat.id
1.我需要的是在搜索{{1}时仅将chat.id
1(如上例所示)作为选择结果111和222。
我在这里找到了一些答案,但是他们没有太多帮助......我总是得到其他的chat.id值。
如果您需要任何额外的解释,我就在这里回答。
提前致谢!
答案 0 :(得分:4)
这实际上是“set-within-sets”查询的一个示例:您询问给定聊天的用户集是否包含某些用户。我喜欢用聚合和having
子句来解决这些问题,因为这是一种非常通用的方法。
以下是查询:
select c.*
from chat_user cu join
user u
on cu.user_id = u.id join
chat c
on cu.chat_id = c.id
group by cu.chat_id
having sum(u.external_id = '111') > 0 and
sum(u.external_id = '222') > 0
这是通过chat_user
中的聊天进行汇总。 having
子句中的第一个条件是:“用户111是否存在?”。第二个说:“用户222在场吗?”仅返回具有两个用户示例的聊天ID。
答案 1 :(得分:2)
SELECT id FROM chat AS c
INNER JOIN chat_user AS cu1 ON c.id = cu1.chat_id
INNER JOIN chat_user AS cu2 ON c.id = cu2.chat_id AND cu1.id < cu2.id
INNER JOIN user AS u1 ON u1.id = cu1.user_id
INNER JOIN user AS u2 ON u2.id = cu2.user_id
WHERE u1.external_id = 111
AND u2.external_id = 222
AND cu1.id < cu2.id
部分强制chat_user
与id
1加入es cu1
,chat_user
加id
2加入为cu2
。这消除了chat_user
id
2加入cu1
而chat_user
加id
1加为cu2
的记录。我的猜测是你在尝试中省略了这个条款,这导致重复。