我正在运行一个学校奖励系统,教职员工根据积极的态度和行为为学生分配积分。
我有两个表:
工作人员
ID
、名字
、姓氏
、职位
、教师
、主题
, 时间
, 分配
交易
Transaction_ID
、日期时间
、Giver_ID
、Recipient_ID
、积分
、Category_ID
,原因
我正在尝试编写一条 SQL 语句来显示员工每周分配的积分数。
此声明...
SELECT
CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
SUM(t.Points) AS `Points Allocated`
FROM transactions t
LEFT JOIN staff s ON t.Giver_ID = s.ID
WHERE `Datetime` >= '2012-10-08'
GROUP BY t.Giver_ID
ORDER BY `Points Allocated` ASC
...显示该周已分配积分的用户列表以及数量。
但是,它不会显示分配了 0 分的用户。
有没有办法修改我的声明以包含这些用户?可能会使用 staff
表并连接到 transactions
来反向编写连接?不幸的是,我不知道从哪里开始。
提前致谢,
最佳答案
是的,你必须逆转,
SELECT
CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
COALESCE(SUM(t.Points), 0) AS `Points Allocated`
FROM staff s
LEFT JOIN transactions t ON t.Giver_ID = s.ID
WHERE t.Datetime >= '2012-10-08' or t.Datetime IS NULL
GROUP BY s.ID
ORDER BY `Points Allocated` ASC
编辑
按照 Ianzz 的建议,应该更快
SELECT
CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
COALESCE(SUM(t.Points), 0) AS `Points Allocated`
FROM staff s
LEFT JOIN transactions t ON t.Giver_ID = s.ID and t.Datetime >='2012-10-08'
GROUP BY s.ID
ORDER BY `Points Allocated` ASC
或者在 s.ID 上使用 RIGHT JOIN 和分组(在这两种情况下,如果您不想要空值,则在 SUM(t.Points) 上使用合并,您还必须检查“NULL transaction datetime”,或者使用连接中的日期谓词
您会看到更多的 LEFT JOIN 然后是 RIGHT JOIN,您可以将其读作 从我的主要实体中选择全部(在 FROM 子句中),并尝试连接另一个存在连接数据的实体。但两者应该工作相同
关于mysql - JOIN 语句显示所有已分配积分的用户 - 有没有办法也包括未分配任何积分的用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12842068/