【问题标题】:MySQL Selecting Linked RowsMySQL 选择链接的行
【发布时间】:2009-09-01 05:55:34
【问题描述】:

我有两张桌子:

表“A”:

+----------+
| item_id  |
+----------+
| 10       |
| 20       |
| 30       |
| 40       |
+----------+

和表“B”:

+----------+-------------+
| item_id  |   user_id   |
+----------+-------------+
| 10       | 1           |
| 10       | 2           |
| 20       | 1           |
| 30       | 2           |
+----------+-------------+

字段“item_id”是一个通用字段。

如果我希望从表 A 中选择用户 1 和 2 都存在的所有行(但不是只有两个用户之一存在的行),我该如何构建这个查询? (我希望在 item_id 为 10 的结果中有一行)。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    试试这个:

      SELECT a.item_id
        FROM TABLE_A a
        JOIN TABLE_B b ON b.item_id = a.item_id
       WHERE b.user_id IN (1, 2)
    GROUP BY a.item_id
      HAVING COUNT(*) = 2
    

    【讨论】:

    • 如果表很大,这会比连接表 B 自身多次的其他示例更快还是更慢? (只要表有适当的索引)
    【解决方案2】:

    另一种选择:

    SELECT A.*
    FROM tableA A
    INNER JOIN tableB B1 ON B1.item_id = A.item_id AND B1.user_id = 1
    INNER JOIN tableB B2 ON B2.item_id = A.item_id AND B2.user_id = 2
    

    将 A 连接到 B 两次,一次用于一位用户,另一次用于另一位用户。这是另一种声明从 B 到自身的自联接以查找两个用户的项目的方式。

    这不会超出两个用户(每个用户都需要额外的加入)。

    【讨论】:

      【解决方案3】:
      select item_id from table_b where user_id = 1
      intersect
      select item_id from table_b where user_id = 2
      

      【讨论】:

        【解决方案4】:
        SELECT a.item_id FROM a
            INNER JOIN b x ON a.item_id = x.item_id
            INNER JOIN b y ON x.item_id = y.item_id   
                AND x.user_id = 1 AND y.user_id = 2;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多