【问题标题】:Mysql join tablesMysql 连接表
【发布时间】:2011-06-14 16:36:27
【问题描述】:

我在数据库中有三个表。

第一个表是包含用户信息的表,如下所示:

    id     |     name   |     status    
---------------------------------------
    1      |    john    |      1
    2      |    helen   |      1
    3      |    mike    |      1
    4      |    tina    |      1
    5      |    jim     |      0
    6      |    nina    |      1

第二个表包含某些服务的注册用户:

   sid     |   status  
------------------------
    1      |     1
    2      |     1

第三个表包含其他服务的注册用户:

   oid     |   status  
------------------------
    3      |     1
    4      |     1

我应该进行查询,从第二个和第三个表中找到状态为“1”的所有用户,然后从第一个表中获取所有这些用户的名称和 ID(包含用户信息)。此示例的结果如下所示:

   id     |     name   |     status    
---------------------------------------
    1      |    john    |      1
    2      |    helen   |      1
    3      |    mike    |      1
    4      |    tina    |      1

该查询会是什么样子?我应该使用 INNER JOIN 吗?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    INNER JOIN 是正确的方法。

    查询将是

    SELECT user.id, user.name, user.status
    FROM table1 AS user
    INNER JOIN table2 AS service1 ON service1.sid = user.id
    INNER JOIN table3 AS service2 ON service2.oid = user.id
    WHERE service1.status = 1 AND service2.status = 1
    

    如果您想要在 service1 或 service2 上的用户,查询可以是

    SELECT user.id, user.name, user.status
    FROM table1 AS user
    WHERE user.id IN (SELECT sid FROM table2 WHERE status=1) OR
          user.id IN (SELECT oid FROM table3 WHERE status=1)
    

    【讨论】:

      【解决方案2】:

      这将返回在第二个表(称为 service1)中具有状态 1 的一行,在第三个表(服务 2)中具有状态 1 的一行的用户的 id、名称和状态:

      INNER JOIN 解决方案:

      SELECT u.id, u.name, u.status
      FROM users u
      JOIN service1 s ON s.sid = u.id AND s.status=1
      JOIN service2 o ON o.oid = u.id AND o.status=1;
      

      子查询解决方案:

      SELECT u.* FROM users u
      WHERE u.id IN (SELECT s.id FROM service1 s WHERE s.sid = u.id AND s.status=1)
      AND u.id IN (SELECT s.id FROM service2 o WHERE o.oid = u.id AND o.status=1)
      

      第二张或第三张表中用户的子查询解决方案:

      SELECT u.* FROM users u
      WHERE u.id IN (SELECT s.id FROM service1 s WHERE s.sid = u.id AND s.status=1)
      OR u.id IN (SELECT s.id FROM service2 o WHERE o.oid = u.id AND o.status=1)
      

      【讨论】:

      • @user576875- 我尝试了这个查询,但结果只显示了两个表中的用户,第二个和第三个表,而不是这两个表中的所有用户。
      • 添加了第三个查询,该查询应返回位于其中一个表中的用户
      • @user576875- 谢谢。这很好用。使用 INNER JOIN 还是像这样使用多个 SELECT 查询会更好吗?
      【解决方案3】:
      select * from firsttable 
      inner join table2 on id = sid and table2.status = 1
      inner join table3 on id = oid and table3.status = 1
      

      【讨论】:

        猜你喜欢
        • 2014-01-06
        • 2011-09-22
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 2021-12-25
        相关资源
        最近更新 更多