簡體   English   中英

MySQL查詢左聯接條件問題

[英]Mysql Query Left Join Condition Problem

我對mysql查詢有疑問。

我使用5張桌子:

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

所有編號都是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沒有限制,第二個是左連接,所以它對結果沒有限制(所有結果的packageid為NULL,但應該有值)。 如果我將第二個左聯接更改為普通聯接,則組問題將得到解決,但查詢無法再找到沒有組的用戶。

任何想法如何解決這個問題,甚至可能嗎? 提前致謝!

因為您將搜索限制為特定的組packageid'2',所以為什么不只創建兩個LEFT JOIN INNER JOINS,然后在WHERE子句中放入ag.packageid = 2?

您是說您實際上在查詢結果中看到值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`
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的意思是相同的,但我想明確一點。 考慮到您加入的條件,我敢打賭,您正在使用不同的程序包來組,但是沒有得到程序包嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM