Mysql查询左连接条件问题

时间:2010-10-15 18:41:44

标签: mysql join

我有一个关于mysql查询的问题。

我使用5个表:

user_has_data(uid,dataid);用户(uid,uname); user_in_group(uid,groupid,data);组(groupid,data,packageid);包(packageid,name)

所有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,但应该有值)。如果我将第二个左连接更改为普通连接,则组问题将被修复,但查询无法再找到没有组的用户。

任何想法如何解决这个甚至可能? 提前谢谢!

3 个答案:

答案 0 :(得分:0)

因为您将搜索范围限制为特定组packageid为“2”,为什么不直接进行LEFT JOIN INNER JOINS,然后在WHERE子句中输入ag.packageid = 2?

答案 1 :(得分: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`

答案 2 :(得分: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意思相同,但我喜欢明确。根据您加入的条件,我敢打赌您正在获得包含不同套餐的团体,但没有获得套餐?