mysql - 按周检查的 SQL 查询

标签 mysql sql

我需要一个 SQL 查询来检查一个人是否在一年中连续两周处于事件状态。

例如,

Table1:
Name | Activity | Date
Name1|Basketball| 08-08-2014
Name2|Volleyball| 08-09-2014
Name3|None      | 08-10-2014
Name1|Tennis    | 08-14-2014

我想检索 Name1,因为该人在一年中连续两周处于事件状态。

到目前为止,这是我的查询:

SELECT DISTINCT Name 
FROM Table1 
Where YEAR(Date) = 2014 AND 
      Activity NOT 'None' AND

这是我需要连续两周检查事件的逻辑的地方。一周可以用7到14天来形容。我正在使用 MYSQL。

最佳答案

我有意避免在 where 子句中使用 YEAR(Date),并建议您也这样做。在多行数据上使用函数来满足单个标准 (2014) 对我来说毫无意义,而且它会破坏索引的有效性(请参阅维基百科上的“sargable”)。恕我直言,仅按日期范围定义过滤器会更容易。

我使用了相关子查询来派生 nxt_date,它可能无法很好地扩展,但总体性能很可能取决于您的索引。

select distinct
      name
from (
      select
              t.name
            , t.Activity
            , t.`Date`
            , (
               select min(table1.`Date`) from table1 
               where t.name = table1.name 
               and table1.Activity <> 'None'
               and table1.`Date` > t.`Date`
               ) as nxt_date
      from table1 as t
      where ( t.`Date` >= '2014-01-01' and t.`Date` < '2015-01-01' )
      and t.Activity <> 'None'
      ) as sq
where datediff(sq.nxt_date, sq.`Date`) <= 14
;

参见:http://sqlfiddle.com/#!9/cbbb3/9

关于mysql - 按周检查的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25160423/

相关文章:

java - 此代码可用于连接到 SQL Server 2008 吗?

php - 如何防止 PHP 中的 SQL 注入(inject)?

sql - 将 UTF-8 字符串经典 ASP 转换为 SQL 数据库

mysql - 如何在不将参数传递给 PHP 页面的情况下使用 ReactJS 插入 MySQL

php - 如何保护 SQL 查询的输入安全?

sql - INTERSECT 和 JOIN 有什么不同?

mysql - 识别其他表中不存在的值

php 使用 mysql 插入、查找、更新

php - 许可应用程序的服务器安全性

mysql - 选择具有三个最大值的组