【发布时间】:2010-10-15 18:41:43
【问题描述】:
我有一个 mysql 查询的小问题。
我用了 5 张桌子:
user_has_data (uid, dataid);用户(uid,uname); user_in_group(uid, groupid, 数据);组(组ID,数据,包ID);包(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 没有限制,第二个是左连接,所以它对结果没有限制(对于所有结果,packageid 都是 NULL,但应该有值)。如果我将第二个左连接更改为普通连接,组问题将得到解决,但查询无法再找到没有组的用户。
任何想法如何解决这个甚至可能? 提前致谢!
【问题讨论】: