MySQL连接表

3
我在数据库中有三个表。
第一个表是包含用户信息的表,看起来像这样:
    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吗?
3个回答

2

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)

1

此查询返回在第二个表(称为service1)中具有status1的行和在第三个表(service2)中具有status1的行的用户的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- 我尝试使用这个查询,但结果只显示那些同时在第二个和第三个表中的用户,而不是这两个表中的所有用户。 - Sergio
添加了第三个查询,应该返回在其中一个表中的用户。 - Arnaud Le Blanc
@user576875- 谢谢。这个很好用。使用INNER JOIN还是像这样使用多个SELECT的查询更好呢? - Sergio

0
select * from firsttable 
inner join table2 on id = sid and table2.status = 1
inner join table3 on id = oid and table3.status = 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接