嘿,我尝试从一个表中选择一行,而另一个表中有两个匹配的条目。 结构如下:
----------------- ---------------------
| messagegroups | | user_messagegroup |
| | | |
| - id | | - id |
| - status | | - user_id |
| | | - messagegroup_id |
----------------- | |
---------------------
user_messagegroup 中存在两行,其中包含两个用户的 id,并且两次都是相同的 messagegroup_id。 我想选择这两个用户所在的消息组。
我不明白..所以我会很感激一些帮助;)
最佳答案
您提供的规范不是很清楚。
你说“有两个用户的 ID”...如果我们认为这意味着你有两个 user_id 值你想在查询中提供,那么找到包含这两个特定用户的消息组的一种方法:
SELECT g.id
, g.status
FROM messagegroups g
JOIN ( SELECT u.messagegroup_id
FROM user_messagegroup u
WHERE u.user_id IN (42, 11)
GROUP BY u.messagegroup_id
HAVING COUNT(DISTINCT u.user_id) = 2
) c
ON c.messagegroup_id = g.id
除了指定的两个用户之外,返回的消息组还可以包含其他用户。
如果你想返回只包含这两个用户的消息组,而不包含其他用户......
SELECT g.id
, g.status
FROM messagegroups g
JOIN ( SELECT u.messagegroup_id
FROM user_messagegroup u
WHERE u.user_id IS NOT NULL
GROUP BY u.messagegroup_id
HAVING COUNT(DISTINCT IF(u.user_id IN (42,11),u.user_id,NULL)) = 2
AND COUNT(DISTINCT u.user_id) = 2
) c
ON c.messagegroup_id = g.id
为了提高性能,您需要在表上使用合适的索引,并且可以重写这些索引以消除内联 View 。
此外,如果您只需要 messagegroup_id 值,则可以仅从内联 View 查询中获取该值,而无需外部查询和对 messagegroups 表的连接操作。
关于MySQL 从另一个表中选择具有两个匹配连接行的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26081600/