我有一个关于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,但应该有值)。如果我将第二个左连接更改为普通连接,则组问题将被修复,但查询无法再找到没有组的用户。
任何想法如何解决这个甚至可能? 提前谢谢!
答案 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意思相同,但我喜欢明确。根据您加入的条件,我敢打赌您正在获得包含不同套餐的团体,但没有获得套餐?