MYSQL:右连接不返回预期的行

时间:2016-06-02 11:42:06

标签: mysql sql

我试图从三个不同的表中获取数据,我试图通过使用RIGHT JOIN显示其他表中的所有行但是我似乎没有返回它们...

SELECT id, user_name, first_name, last_name FROM vtigercrm600.vtiger_users
RIGHT JOIN vtigercrm600.vtiger_users2group
    on vtigercrm600.vtiger_users.id = vtigercrm600.vtiger_users2group.userid
RIGHT JOIN vtigercrm600.vtiger_groups
    on vtigercrm600.vtiger_users2group.groupid = vtigercrm600.vtiger_groups.groupid
WHERE vtigercrm600.vtiger_users.id = '5'
group by vtiger_users.id;   

我从这个

获得以下内容
||ID||user_name||first_name||last_name||
|| 5||user1    ||john      ||smith    ||

但我期待来自其他表格的数据,例如

||ID||user_name||first_name||last_name||groupid||userid||groupname ||description     ||
|| 5||user1    ||john      ||smith    ||     14||     5||Sales Dept||Sales Dept Group||

用户表

||id||user_name||first_name||last_name||

users2group table

||groupid||userid||

分组表

||groupid||groupname||description||

2 个答案:

答案 0 :(得分:3)

使用right join时,where子句应仅包含 last 表中的条件。但是,我不建议使用right join。大多数人发现left join更容易理解 - 因为它会将所有行保留在第一个表中。

我认为您应该尝试使用left join。 。 。表格顺序相同。要从其他表中获取列,您需要在select中包含

我怀疑这是你想要的逻辑:

SELECT u.id, u.user_name, u.first_name, u.last_name, g.*
FROM vtigercrm600.vtiger_users u LEFT JOIN
    vtigercrm600.vtiger_users2group ug
    on u.id = ug.userid LEFT JOIN
    vtigercrm600.vtiger_groups g
    on ug.groupid = g.groupid
WHERE u.id = 5;

注意:

  • 您的查询似乎不需要group by。我没有看到任何汇总。
  • 如果id是一个数字,则不要使用单引号。仅对字符串和日期常量使用单引号。
  • LEFT JOIN可能会被INNER JOIN替换 - 但如果用户不在任何群组中,您将不会获得任何行。
  • 表别名使查询更易于编写和阅读。
  • 你应该养成对所有列名进行限定的习惯。

答案 1 :(得分:1)

您需要在SELECT语句中列出所有表中所需的所有列。像

SELECT vtigercrm600.vtiger_users.id, vtigercrm600.vtiger_users.user_name, vtigercrm600.vtiger_users.first_name, vtigercrm600.vtiger_users.last_name, vtigercrm600.vtiger_groups.groupname, vtigercrm600.vtiger_groups.description ...