如何在 30 天记录之前在 mysql 查询中添加 where 条件

Posted

技术标签:

【中文标题】如何在 30 天记录之前在 mysql 查询中添加 where 条件【英文标题】:how to add where condition in mysql query before 30 days record 【发布时间】: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天! 见meta.***.com/questions/333952/… 【参考方案1】:

试试这个:

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 

这只是基于您的查询。我不知道表结构或预期的输出。要提高此查询的性能,您应该查看索引。查看查询的EXPLAIN 计划以了解问题区域是什么。

【讨论】:

以上是关于如何在 30 天记录之前在 mysql 查询中添加 where 条件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel (MYSQL) 中添加间隔 30 天

MySQL:如何在查询中向日期时间字段添加一天

mysql查询今天,昨天,近7天,近30天,本月,上一月数据

mysql查询今天昨天近7天近30天本月上一月的SQL语句

如何在 CosmosDB 上查询最近 30 天?

板邓:mysql查询今天,昨天,近7天,近30天,本月,上一月数据的方法