【发布时间】:2018-09-02 14:39:38
【问题描述】:
我尝试在记录前 30 天进行查询以获取记录。我有两个表学生和学生参加跟踪。我试图找出谁缺席了 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
查询在输出下方返回。
------------------------------------------------------
| 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|
------------------------------------------------------
由于大数据(超过 200k)不起作用,我尝试了子查询 NOT IN 和 <>。
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
请建议我如何优化查询。
【问题讨论】:
-
你想得到什么?不确定
get the record 30 days before record是什么意思。发布表的架构,并解释您要对查询执行的操作。 -
我尝试获取缺席30天前的记录。
-
你的意思是谁30天没有缺席?或者谁缺席了 30 天?
-
谁缺席了30天!
标签: php mysql performance large-data