mysql查询最近14天、每个人员的记录,但是若当天没有全部记录、或当天没有少数人员的记录时,怎么让其返回0

mysql查询最近14天、每个人员的记录,但是若当天没有全部记录、或当天没有少数人员的记录时,怎么让其返回0

可以新建一个表,里面只存储日期,然后连表查询

直接遍历近14天日期,然后关联查询一下,大致这意思,时间范围自己写

     SELECT
        date_add(DATE_ADD(curdate(), INTERVAL - DAY(curdate()) + 2 DAY),
        INTERVAL (cast( help_topic_id AS signed INTEGER ) - 1 ) DAY 
        ) DAY 
    FROM
        mysql.help_topic 
    WHERE
        help_topic_id < DAY ( last_day( curdate( ) ) ) 
    ORDER BY
        help_topic_id
 

假设你有一个名为records的表,包含以下字段:date(日期)、person(人员名称)和其他相关字段。

SELECT
  date_range.date AS date,
  people.name AS person,
  IFNULL(records.count, 0) AS record_count
FROM
  (
    SELECT CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS date
    FROM
      (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
       UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
       UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
      CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
                  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
                  UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
      CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
                  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
                  UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
  ) AS date_range
  CROSS JOIN (
    SELECT DISTINCT person FROM records
  ) AS people
  LEFT JOIN (
    SELECT date, person, COUNT(*) AS count
    FROM records
    WHERE date >= CURDATE() - INTERVAL 13 DAY
    GROUP BY date, person
  ) AS records ON date_range.date = records.date AND people.person = records.person
ORDER BY date, person;

这个查询首先生成了一个日期范围,从最近的14天开始。然后,使用CROSS JOIN将日期范围和人员列表进行组合。接下来,使用LEFT JOIN将生成的日期范围和人员列表与实际记录进行连接,以获取每个日期和每个人员的记录数量。最后,使用IFNULL函数将缺少记录的地方填充为0。

请将代码中的records、date和person替换为实际的表名和字段名。运行该查询后,你将获得最近14天内每个人员的记录数量,缺少记录的日期和人员将返回0。

SELECT * FROM (
    SELECT 
        employee_id, 
        DATE(date_field) AS date,
        COUNT(id) AS records 
    FROM yourTable 
    WHERE date_field >= DATE_SUB(CURDATE(), INTERVAL 14 DAY)
    GROUP BY employee_id, date 
) t 
WHERE records > 0 
ORDER BY employee_id, date; 

查询最近 14 天内(使用 DATE_SUB() 函数)的 records ,并按 employee_id 和 date 分组;使用一个子查询优化语句,子查询的结果不包含 records = 0 的行;拼接上一个外层查询,使用 MAX() 函数获取每个 employee_id 每天的最新记录;COALESCE() 函数用于如果某天无记录返回 0

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7651581
  • 这篇博客也不错, 你可以看下Mysql 空间数据类型(入门教程)多边形、矩形、点相交包含等条件查询,常用函数详细介绍(图文教学,简单易学)
  • 你还可以看下mysql参考手册中的 MySQL 字符集、对齐方式、统一编码 复杂字符集的字符串拼写支持
  • 除此之外, 这篇博客: mysql系列之:建表实现主键自增、创建多个字段唯一约束、创建索引中的 一、查看建好表的主键、索引、唯一约束 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 如下所示,成功建立表的主键、索引、唯一约束
    在这里插入图片描述

  • 您还可以看一下 刘运强老师的MySQL数据库从入门到实战课课程中的 条件查询(单条件、多条件)小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    以问题的目标为导向,我们可以使用以下步骤来解决问题:

    1. 确定数据表的结构和字段,假设我们有一个名为records的表,包含idperson_iddatevalue字段,其中person_id表示人员的ID,date表示记录的日期,value表示记录的值。

    2. 编写查询语句来获取最近14天每个人员的记录。我们可以使用以下语句来完成这个任务:

    SELECT 
        r.person_id,
        r.date,
        COALESCE(r.value, 0) AS value
    FROM 
        (SELECT DISTINCT person_id 
         FROM records) AS p
    LEFT JOIN 
        records AS r ON p.person_id = r.person_id 
                      AND r.date >= CURDATE() - INTERVAL 14 DAY
    ORDER BY 
        r.person_id, r.date
    

    上述查询中,首先通过子查询获取所有人员的ID(SELECT DISTINCT person_id FROM records),然后使用LEFT JOIN将人员表和记录表联接起来,保证每个人员在结果中都会出现,并获取最近14天的记录(r.date >= CURDATE() - INTERVAL 14 DAY)。使用COALESCE函数来将没有记录的值设置为0。

    1. 执行查询语句并获取结果。根据具体的编程环境和语言,可以使用相应的数据库连接库来执行查询并获取结果。以下为一个Python的示例代码:
    import mysql.connector
    
    # 创建数据库连接
    cnx = mysql.connector.connect(
        host="localhost",
        user="your_username",
        password="your_password",
        database="your_database"
    )
    
    # 创建游标对象
    cursor = cnx.cursor()
    
    # 执行查询语句
    query = """
    SELECT 
        r.person_id,
        r.date,
        COALESCE(r.value, 0) AS value
    FROM 
        (SELECT DISTINCT person_id 
         FROM records) AS p
    LEFT JOIN 
        records AS r ON p.person_id = r.person_id 
                      AND r.date >= CURDATE() - INTERVAL 14 DAY
    ORDER BY 
        r.person_id, r.date
    """
    cursor.execute(query)
    
    # 获取结果
    result = cursor.fetchall()
    
    # 关闭游标和连接
    cursor.close()
    cnx.close()
    
    # 输出结果
    for row in result:
        print(row)
    

    注意替换示例代码中的数据库连接信息(your_usernameyour_passwordyour_database)为你的实际数据库连接信息。

    这样,我们就可以在MySQL中查询最近14天每个人员的记录,并在某些人员当天没有记录时返回0。