JOIN语句显示已分配点的所有用户 - 是否还有一种方法可以包括尚未分配任何点的用户?

时间:2012-10-11 14:35:07

标签: mysql

我正在运行一个学校奖励系统,其中员工为学生分配积极的态度和行为。

我有两张桌子:

员工 IDFirstnameSurnamePositionFacultySubjectHoursAllocation

交易 Transaction_IDDatetimeGiver_IDRecipient_IDPointsCategory_IDReason

我正在尝试编写一条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

...显示已分配当周点数的用户列表以及数量。

Reward System - Staff Names and Points Allocated

然而,它不会显示已分配0分的用户。

有没有办法修改我的陈述以包含这些用户?可能是使用staff表并加入transactions反向编写联接?不幸的是,我不知道从哪里开始。

提前致谢,

2 个答案:

答案 0 :(得分:1)

是的,你必须逆转,

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和group(在这两种情况下,如果您不想要空值,则必须使用SUM上的合并(t.Points),您还必须检查“NULL transaction datetime”,或者使用联接中的日期谓词

你会看到更多LEFT JOIN然后RIGHT JOIN,因为你可以读到它 从我的主体实体中选择all(在FROM子句中),并尝试连接另一个存在连接数据的地方。但两者都应该相同

答案 1 :(得分:0)

您必须按员工表中的ID进行分组,而不是使用事务表中的ID进行分组,而是使用右连接。由于您希望在交易表中保留“null”的员工。

SELECT
  CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
  SUM(t.Points) AS `Points Allocated`
FROM transactions t
RIGHT JOIN staff s ON t.Giver_ID = s.ID
WHERE `Datetime` >= '2012-10-08'
GROUP BY s.ID
ORDER BY `Points Allocated` ASC