如何在30天记录前的mysql查询中添加where条件
how to add where condition in mysql query before 30 days record
我试图查询以获取记录前 30 天的记录。我有两个 table 学生和学生参加跟踪。我试图找出谁缺席了 30 天。还有我的查询和结果。
SELECT * FROM student st, attend_track at
WHERE can.can_status = 1
AND DATEDIFF(NOW(), DATE(st.created)) > 30
AND st.std_id = st.std_id
ORDER BY UNIX_TIMESTAMP(at.created) DESC
下面的查询return输出。
------------------------------------------------------
| Student name | Class | Created |
------------------------------------------------------
| AAA | XL | 21/02/18|
------------------------------------------------------
| BBB | XL | 18/02/18|
------------------------------------------------------
| CCC | XL | 12/02/18|
------------------------------------------------------
| DDD | XL | 08/02/18|
------------------------------------------------------
| EEE | XL | 02/02/18|
------------------------------------------------------
| FFF | XL | 22/01/18|
------------------------------------------------------
但当天已经出现以下记录。
------------------------------------------------------
| Student name | Class | Created |
------------------------------------------------------
| CCC | XL | 10/03/18|
------------------------------------------------------
| DDD | XL | 20/03/18|
------------------------------------------------------
| FFF | XL | 28/02/18|
------------------------------------------------------
我试过子查询 NOT IN 并且 <>
由于大数据(超过 200k)不起作用。
SELECT *
FROM student st, attend_track atr
WHERE st.std_status = 1
AND DATEDIFF(NOW(), DATE(atr.created)) > 30
AND st.std_id = atr.std_id
AND st.std_id NOT IN (SELECT atr.std_id
FROM attend_track atk
WHERE DATEDIFF(NOW(), DATE(atk.created)) < 30)
ORDER BY UNIX_TIMESTAMP(atr.created) DESC
请建议我如何优化查询。
试试这个:
SELECT *
FROM (SELECT std_id, MAX(atr.created) last_attended
FROM attend_track atr
GROUP BY std_id) lst
INNER JOIN student st ON st.std_id = lst.std_id
WHERE DATEDIFF(NOW(), DATE(last_attended)) > 30
这只是基于您的查询。我不知道 table 结构或预期的输出。要提高此查询的性能,您应该查看您的索引。查看查询的 EXPLAIN
计划以了解问题所在。
我试图查询以获取记录前 30 天的记录。我有两个 table 学生和学生参加跟踪。我试图找出谁缺席了 30 天。还有我的查询和结果。
SELECT * FROM student st, attend_track at
WHERE can.can_status = 1
AND DATEDIFF(NOW(), DATE(st.created)) > 30
AND st.std_id = st.std_id
ORDER BY UNIX_TIMESTAMP(at.created) DESC
下面的查询return输出。
------------------------------------------------------
| Student name | Class | Created |
------------------------------------------------------
| AAA | XL | 21/02/18|
------------------------------------------------------
| BBB | XL | 18/02/18|
------------------------------------------------------
| CCC | XL | 12/02/18|
------------------------------------------------------
| DDD | XL | 08/02/18|
------------------------------------------------------
| EEE | XL | 02/02/18|
------------------------------------------------------
| FFF | XL | 22/01/18|
------------------------------------------------------
但当天已经出现以下记录。
------------------------------------------------------
| Student name | Class | Created |
------------------------------------------------------
| CCC | XL | 10/03/18|
------------------------------------------------------
| DDD | XL | 20/03/18|
------------------------------------------------------
| FFF | XL | 28/02/18|
------------------------------------------------------
我试过子查询 NOT IN 并且 <>
由于大数据(超过 200k)不起作用。
SELECT *
FROM student st, attend_track atr
WHERE st.std_status = 1
AND DATEDIFF(NOW(), DATE(atr.created)) > 30
AND st.std_id = atr.std_id
AND st.std_id NOT IN (SELECT atr.std_id
FROM attend_track atk
WHERE DATEDIFF(NOW(), DATE(atk.created)) < 30)
ORDER BY UNIX_TIMESTAMP(atr.created) DESC
请建议我如何优化查询。
试试这个:
SELECT *
FROM (SELECT std_id, MAX(atr.created) last_attended
FROM attend_track atr
GROUP BY std_id) lst
INNER JOIN student st ON st.std_id = lst.std_id
WHERE DATEDIFF(NOW(), DATE(last_attended)) > 30
这只是基于您的查询。我不知道 table 结构或预期的输出。要提高此查询的性能,您应该查看您的索引。查看查询的 EXPLAIN
计划以了解问题所在。