SQL Query从多个嵌套子查询

时间:2017-11-16 01:27:24

标签: mysql sql database

我对这个SQL查询有点麻烦,我无法解决它。我有一个网站,其中具有类似主持人角色的用户可以更改他们下面的用户帐户类型,现在我确实有一个工作更改日志,但我在显示正确信息时遇到问题。我有这三个表:

角色: Role_ID,Role_Type

用户: User_ID,名字,姓氏,角色ID

更改日志: Log_ID,Moderator_ID,User_ID,Prev_Role_ID,New_Role_ID,Logtime

要说明,更改日志具有唯一的Log_ID,然后Moderator_ID是进行更改的人的User_ID,User_ID则是已更改的用户帐户的ID。而Role_ID就是改变它的原因。

所以我想显示日志ID,主持人的名字和姓氏,用户的名字和姓氏,以及之前的角色和新角色。

我正在使用嵌套选择,但我认为我的问题是加入表,因为一切都很好,除了我有很多记录,当我按照Log_ID分组时,它最终显示我的记录,但对角色的更改不正确。它返回所有组合,所以我想我需要一些JOINS,但我不确定将它们放在哪里或放在哪里。

SELECT changelogs.log_id, a.lastname AS mlastname, a.firstname AS mfirstname, 
b.lastname AS ulastname, b.firstname AS ufirstname, c.role_type AS 
pre_role, d.role_type AS new_role, changelogs.logtime 

FROM (SELECT log_id, lastname, firstname FROM users, changelogs 
      WHERE users.user_id = changelogs.mod_id) a,

     (SELECT log_id, lastname, firstname FROM users, changelogs 
      WHERE users.user_id = changelogs.user_id) b,

     (SELECT log_id, role_type FROM roles, changelogs 
      WHERE changelogs.prev_role_id = roles.role_id) c,

     (SELECT log_id, role_type FROM roles, changelogs 
      WHERE roles.role_id = changelogs.role_id) d, changelogs;

我基本上只想查看我的更改日志表,只需要在其ID的位置以及ID的位置使用名称。

结果: Log_ID,mLastname,mFirstname,uLastname,uFirstname,Pre_Role,New_Role,Time

很抱歉这个愚蠢的问题,但它已经困扰了我很长一段时间。

2 个答案:

答案 0 :(得分:1)

为每个联接表提供一个有意义的别名(不要使用序列a,b,c,d ......),这里不需要子查询:

SELECT
      c.log_id
    , m.lastname  AS mlastname
    , m.firstname AS mfirstname
    , u.lastname  AS ulastname
    , u.firstname AS ufirstname
    , p.role_type AS pre_role
    , r.role_type AS new_role
    , c.logtime
FROM changelogs c
INNER JOIN users u ON c.user_id = u.user_id
INNER JOIN users m ON c.mod_id = m.user_id 
INNER JOIN roles r ON c.role_id = r.role_id 
INNER JOIN roles p ON c.prev_role_id = p.role_id

小费当您发现自己在表名后输入逗号时,STOP。删除逗号并考虑您需要加入此表。您将立即使用良好的显式连接。

答案 1 :(得分:0)

试试这个解决方案..它应该可以工作。

SELECT a.log_id, c.lastname  AS mlastname, c.firstname AS mfirstname, b.lastname  AS ulastname
    , b.firstname AS ufirstname, e.role_type AS pre_role, d.role_type AS new_role, a.logtime
FROM Changelogs a
JOIN Users b ON a.user_id = b.user_id
JOIN Users c ON a.moderator_id = c.user_id 
JOIN Role d ON a.New_Role_id = d.Role_ID 
JOIN Role e ON a.prev_role_id = e.Role_ID