2010-10-15 105 views
1

我有一個mysql查詢的問題。Mysql查詢左連接條件問題

我使用5個表:

user_has_data(UID,數據ID);用戶(uid,uname); user_in_group(uid,groupid,data);組(groupid,data,packageid);包(packageid,名稱)

所有id都是PK。我想構建一個sql查詢,通過它的uname查找屬於指定dataid的用戶,並檢查用戶是否在屬於指定包的組中(表user_in_group中的關係)(一個組被分配給一個包)。如果是這樣的話,那麼應該提取來自用戶,包和組的數據,否則只應該提取用戶數據。所以我用左聯接,所以我也可以得到用戶沒有組:

SELECT `uac`.`uid`, `u`.`uid`, `uig`.`groupid`, `ag`.`packageid` 
FROM `user_has_data` AS `uac` 
INNER JOIN `users` AS `u` ON u.uid = uac.uid 
LEFT JOIN `user_in_group` AS `uig` ON uig.uid = uac.uid 
LEFT JOIN `groups` AS `ag` ON (ag.groupid = uig.groupid) AND (ag.packageid = 2) 
WHERE (uac.dataid = '3') AND (u.uname LIKE 'test%') 
GROUP BY `u`.`uid` 

不幸的是我得到錯誤的結果:我得到具有不同包標識比加入指出,如果用戶有另一組羣分配給他一個不同的packageid。

可能這是因爲第一個左連接沒有對packageid的限制,第二個是左連接,所以它對結果沒有限制(packageid對於所有結果都是NULL,但應該有值)。如果我將第二個左連接更改爲普通連接,則組問題將被修復,但查詢無法找到沒有組的用戶。

任何想法如何解決這個問題甚至可能嗎? 在此先感謝!

回答

0

你是說你實際上在查詢結果中看到了值ag.packageid = 2嗎?

如果不是這樣,我想你可以嘗試這樣的:

SELECT `uac`.`uid`, `u`.`uid`, `g`.`groupid`, `g`.`packageid` 
FROM `user_has_data` AS `uac` 
INNER JOIN `users` AS `u` ON u.uid = uac.uid 
LEFT JOIN (`user_in_group` AS `uig` 
    INNER JOIN `groups` AS `ag` ON (ag.groupid = uig.groupid) AND (ag.packageid = 2)) 
AS `g` ON uac.uid = g.uid 
WHERE (uac.dataid = '3') AND (u.uname LIKE 'test%') 
GROUP BY `u`.`uid` 
+0

乍一看,這可以按預期工作!非常感謝。 – max 2010-10-15 20:08:29

0

由於您將搜索範圍限制爲特定組packageid爲'2'的原因,爲何不將兩個LEFT JOIN INNER JOINS都放在一起,然後在WHERE子句中引入ag.packageid = 2?

+0

如果兩個連接都是INNER JOIN,則查詢無法再找到沒有組的用戶(但它也應該找到那種用戶) – max 2010-10-15 18:54:50

0
SELECT `uac`.`uid`, `u`.`uid`, `uig`.`groupid`, `ag`.`packageid` 
FROM `user_has_data` AS `uac` 
INNER JOIN `users` AS `u` ON u.uid = uac.uid 
LEFT OUTER JOIN `user_in_group` AS `uig` ON uig.uid = uac.uid 
LEFT OUTER JOIN `groups` AS `ag` ON ag.groupid = uig.groupid 
WHERE (uac.dataid = '3') AND (u.uname LIKE 'test%') 
AND (ag.packageid = 2 OR uig.uid IS NULL) 
GROUP BY `u`.`uid` 

我知道LEFT JOIN和LEFT OUTER JOIN意味着同樣的事情,但我想是明確的。有了你加入的條件,我敢打賭你會得到不同包裹的團隊,但沒有收到包裹?

+0

謝謝你的回答。實際上它提高了結果,但它只會得到沒有組的用戶(如果我實現它正確)... – max 2010-10-15 20:14:50

+0

我沒注意GROUP BY。當你刪除它時,你會得到什麼? – Andrew 2010-10-15 20:51:11