Mysql查询Left Join条件问题

标签 mysql join

我有一个 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/

相关文章:

sql - SQL中如何显示多个表的数据

PHP图片上传脚本未上传但未失败

javascript - MySQL 的时间验证范围

mysql插入重复键更新知道它是否发生

mysql - 陷入 mysql 查询和 JOIN 困境

php - 使用 php mysql 显示外键值

php - 如何从3个表中的部分列数据排序mysql查询输出

php - 无法更新 MYSQL

mysql - 如何链接这些 MYSQL 表?

sql - 通过前缀连接,类似于 SQL 的 ON ... LIKE