我有一个 mysql 查询的小问题。
我使用 5 个表:
user_has_data (uid, dataid);用户(uid,uname); user_in_group(uid, groupid, 数据);组(groupid,数据,packageid);包(包ID,名称)
所有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,但应该有值)。如果我将第二个左联接更改为普通联接,组问题将得到解决,但查询将无法再找到没有组的用户。
任何想法如何解决这个问题,甚至可能? 提前致谢!
最佳答案
您是说您实际上在查询结果中看到了值 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`
关于Mysql查询Left Join条件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3945119/