mysql - JOIN 语句显示所有已分配积分的用户 - 有没有办法也包括未分配任何积分的用户?

标签 mysql

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

我有两个表:

工作人员 ID名字姓氏职位教师主题, 时间, 分配

交易 Transaction_ID日期时间Giver_IDRecipient_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

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

Reward System - Staff Names and Points Allocated

但是,它不会显示分配了 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/

相关文章:

MySQL:从多列获取唯一计数

mysql - MySQL 数据库损坏,只能通过 innodb_force_recovery=6 进行访问

mysql - 如何在 mysql 或 php 脚本中更新基于依赖项的列?

mysql - 如何从 table1 和 table2 中选择全部,其中 table1.userid ='$userid'

MYSQL 使用动态条件 CASE 连接表

mysql - 如何解决 Cannot delete or update a parent row : a foreign key constraint fails in Spring

asp.net - 数据库中的自动增量功能

mysql - 如何在一张表中包含多个select语句

c# - .NET Framework 4.5 - EF 从 MySQL 数据库中排除 "ufloat"列

mysql - 如何加密论坛注册的用户密码?