我的头在旋转。在过去的两天里,我一直在努力想出一个连接两个表的 MySQL 查询。我遇到了一些并发症。
第一个表,我们称它为log
,有一个已经“登录”的人的日志。每个条目都带有日期时间戳。它由 student_id
和 timestamp
组成。看起来像这样
-------------------------------------
| student_id | timestamp |
| 1234 | 2014-02-26 21:50:27 |
| 2345 | 2014-02-26 21:54:54 |
| 1234 | 2014-03-03 19:18:18 |
| .....etc. |
-------------------------------------
我的第二张表,我们称它为students
,其中包含每个学生的信息。
--------------------------------------------------------
| student_id | name | homeroom |
| 1234 | Charles Reinmuth | Swatosh |
| 2345 | Kathryn Mo | Green |
| 6789 | Emily Salt | Clayborne |
| .....etc. |
--------------------------------------------------------
我想在特定的日期时间范围内返回日志
中少于 X 个条目的学生。包括在该日期时间范围内没有条目的学生。我当前的查询运行良好。但只返回日志中条目 >0 的学生。我试过 LEFT OUTER
和 RIGHT OUTER
但无济于事。这是我当前的查询:
SELECT students.name, students.homeroom, COUNT(1) AS cnt
FROM students
INNER JOIN log ON log.student_id = students.student_id
WHERE log.`datetime` between '2014-02-25 00:00:00' and '2014-03-04 00:00:00'
GROUP BY log.student_id HAVING COUNT(1) < 3
在上面的示例中,这将返回:
--------------------------------------------------
| Name | Homeroom | Count |
| Charles Reinmuth | Swatosh | 2 |
| Kathryn Mo | Green | 1 |
| .....etc. |
--------------------------------------------------
这就是我想要完成的:
--------------------------------------------------
| Name | Homeroom | Count |
| Charles Reinmuth | Swatosh | 2 |
| Kathryn Mo | Green | 1 |
| Emily Salt | Clayborne | 0 |
| .....etc. |
--------------------------------------------------
最佳答案
要获取第二个表中没有匹配项的行,您需要使用LEFT JOIN
。
SELECT students.name, students.homeroom, COUNT(log.student_id) AS cnt
FROM students
LEFT JOIN log
ON log.student_id = students.student_id
AND log.`datetime` between '2014-02-25 00:00:00' and '2014-03-04 00:00:00'
GROUP BY students.student_id
HAVING cnt < 3
注意我所做的其他更改:
COUNT(log.student_id)
- 否则,您将计算students
表中的行,即使没有log
行.COUNT(column)
不计算 null 值,这是您在没有匹配项时得到的值。log.datetime
测试必须移到ON
子句中,因为对于中没有行的学生,它将是
。NULL
>日志- 我更改了
HAVING
子句以使用cnt
别名,以避免必须重复COUNT(log.student_id)
。
关于mysql - 具有多个重复项的 SQL 表连接 - 返回日期范围内小于 X 的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26834932/