MySQL - 选择常用值

时间:2013-06-05 23:09:25

标签: mysql

我正在尝试创建查询,但我不知道如何。

我有三个表:chatchat_useruser

类似的东西:

 ---------      ------------------------       ------------------
|  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值。

如果您需要任何额外的解释,我就在这里回答。

提前致谢!

2 个答案:

答案 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_userid 1加入es cu1chat_userid 2加入为cu2。这消除了chat_user id 2加入cu1chat_userid 1加为cu2的记录。我的猜测是你在尝试中省略了这个条款,这导致重复。