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
如下所示,成功建立表的主键、索引、唯一约束
以问题的目标为导向,我们可以使用以下步骤来解决问题:
确定数据表的结构和字段,假设我们有一个名为records
的表,包含id
、person_id
、date
和value
字段,其中person_id
表示人员的ID,date
表示记录的日期,value
表示记录的值。
编写查询语句来获取最近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。
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_username
、your_password
、your_database
)为你的实际数据库连接信息。
这样,我们就可以在MySQL中查询最近14天每个人员的记录,并在某些人员当天没有记录时返回0。