mysql - 具有多个重复项的 SQL 表连接 - 返回日期范围内小于 X 的计数

标签 mysql

我的头在旋转。在过去的两天里,我一直在努力想出一个连接两个表的 MySQL 查询。我遇到了一些并发症。

第一个表,我们称它为log,有一个已经“登录”的人的日志。每个条目都带有日期时间戳。它由 student_idtimestamp 组成。看起来像这样

  -------------------------------------
  | 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 OUTERRIGHT 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/

相关文章:

mysql - 如何对单行内多个数据集的数据进行排序?

PHP时间比较

php - PHP MYSQL覆盖最后一个连接链接

Mysql限制每组奇怪的结果行数

mysql - 询问!我如何获得每个用户三张 table 的总餐费和费用!这是我的第一个问题,很抱歉给您带来不便

MySQL 排除 JOIN 上的结果

mysql - 使用 SQL,以一种高性能的方式仅替换大文本字段中的一个段落中的字符串(使用子字符串、定位和替换、正则表达式等)

php - 查找时间戳范围在另一个时间戳范围内的所有行

mysql - 带有 SELECT 结果的 SQL 更新

mysql - 如何使用 Spring 5 公开服务?