我在找到理想的结果时遇到了麻烦。
我有3个表:tbl_Policy'a',tbl_User'b',tbl_Reviewed'c'。
当用户审核政策时,来自“b”的用户ID和来自“a”的政策代码将输入带有当前日期(datereviewed)的“c”。
编辑:我需要查看所有用户,所有政策以及是否已经过审核。
对于这个例子:John已经审查了所有3个政策; 詹姆斯只审查了IT政策;和 莎拉没有审查任何
理想情况下,输出为:
User Policy Date Reviewed
John HR January 2, 2014
John IT January 3, 2014
John Smoking January 4, 2014
James HR NULL
James IT January 5, 2014
James Smoking NULL
Sarah HR NULL
Sarah IT NULL
Sarah Smoking NULL
通过以下查询,我可以获得所有用户和所有策略,但是我为每个已完成的策略获得了所有3个策略的条目。
select username, policyname, datereviewed
from tbl_policy a, tbl_user b LEFT JOIN tbl_reviewed c ON c.userid = b.userid
使用上面的示例,输出:
User Policy Date Reviewed
John HR January 2, 2014
John IT January 2, 2014
John Smoking January 2, 2014
John HR January 3, 2014
John IT January 3, 2014
John Smoking January 3, 2014
John HR January 4, 2014
John IT January 4, 2014
John Smoking January 4, 2014
James HR January 2, 2014
James IT January 2, 2014
James Smoking January 2, 2014
Sarah HR NULL
Sarah IT NULL
Sarah Smoking NULL
我希望这很清楚,可以给你一个想法,希望能帮助我。 提前谢谢。
答案 0 :(得分:1)
不要在from
子句中混用不同类型的连接。事实上,从不在那里使用逗号:
select u.username, p.policyname, r.datereviewed
from tbl_user u LEFT JOIN
tbl_reviewed r
ON u.userid = r.userid LEFT JOIN
tbl_policy p
ON p.policyid = r.policyid;
这从tbl_user
开始,因为您希望查看所有用户,可能是他们是否有任何已审核的政策。
我猜测政策的加入条件。
编辑:
现在我明白了你想做什么。您希望为每个用户和每个策略添加一行以及日期:
select u.username, p.policyname, r.datereviewed
from tbl_user u cross join
tbl_policy p LEFT JOIN
tbl_reviewed r
ON u.userid = r.userid and
p.policyid = r.policyid
order by username, policyname;