我对这个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
很抱歉这个愚蠢的问题,但它已经困扰了我很长一段时间。
答案 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