2011-01-24 83 views
3

我在數據庫中有三個表。Mysql連接表

第一個表是一個包含用戶信息和它看起來像一個:

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 

我應該查詢wi會從第二個和第三個表中找到狀態爲'1'的所有用戶,然後從第一個表(包含用戶信息)中獲取所有這些用戶的名稱和標識。這個例子的結果如下所示:

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

該查詢的外觀如何?我應該使用INNER JOIN嗎?

回答

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

這將返回ID,名稱和具有在第二表中的行用戶的身份與STATUS1與STATUS1(稱之爲服務1),在第三個表(服務2)行:

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) 

子查詢soluti爲用戶在第二個或第三個表中的一個:

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) 
+0

@ user576875-我試着用此查詢,但結果只顯示那些兩個表中的用戶,第二個和第三個表中的用戶,而不是這兩個表中的所有用戶。 – Sergio 2011-01-24 19:24:23

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 

如果你想這些都對服務1或服務2用戶,查詢可能是

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)