MySQL 从另一个表中选择具有两个匹配连接行的行

标签 mysql sql database select join

嘿,我尝试从一个表中选择一行,而另一个表中有两个匹配的条目。 结构如下:

-----------------   ---------------------
| 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/

相关文章:

mysql - Sean Lahman 数据库示例查询

java - 从servlet向mysql数据库添加数据

mysql - 在 SpringBoot 中,使用默认值注释字段的正确方法是什么

sql - Postgres 的连胜记录

javascript - 我的 php 代码没有更新我的数据库

java - 我正在获取 MySQL 服务器版本,以便在 '.null' 附近使用正确的语法

mysql - 如何只显示我是成员的加入组 (php)?

java - 将Java连接到MySQL数据库

php - 如何基于列之间的多个关系进行查询-MySQL?

sql - 如果 Oracle 中的总行数超过 10,如何从表中获取行?