mysql选择不在时间段内的行(由两列定义)

标签 mysql sql

问题看起来像这样:

我有一个包含 classes 的表,每个表都有 start_time 和 end_time(存储为 INT - 分钟,例如 120 - 2:00、130 - 2:10),我需要做的是按用户类选择并过滤其余的检索不与所选类发生冲突的类。有人能帮忙吗 ?也许有什么线索?

示例行:

id start end
1   0    100
2   50   150
3   160  200
4   50   150
5   50   100
6   200  300

如果我选择了 id=1 那么它应该返回第 3,6 行(它覆盖了 50 到 100 之间的 2,4,5,所以不可能同时参加这两个类(class))

如果我选择了 id=2,6 那么它应该返回第 3 行

如果我选择了 id=2 那么它应该返回第 3,6 行

如果我选择了 id=6 那么它应该返回第 1、2、3、4、5 行

如果我选择了 id=3 那么它应该返回第 1,2 行

最佳答案

这为一个给定的 ID 提供了重叠的 ID:

select id from classes c
inner join classes noc on noc.id = <given id>
where c.start > noc.end or c.end < noc.start
;

编辑:

就我现在对扩展示例的理解而言,您想要提供 id 的任意子集作为输入,并希望所有 id 不与它们中的任何一个重叠。让我们试试:

select c.* 
from classes c 
left join classes noc on noc.id in (<idlist>) 
     and noc.start < c.end 
     and noc.end > c.start 
where noc.id is null;

根据“重叠”的含义,“<”和“>”可能是“<=”和“>=”。

你听起来不像是在寻找子类,但我认为你会在 set-djungle 中找到自己的出路! ;-)

你的例子“selected id=3”给我 1,2,4,5,6,因为 3 没有重叠。

解释:

  • 完成类(class)
  • 寻找与给定类重叠的类
  • 并且只显示那些没有找到重叠类的类。

noc 代表“不允许的类”。如果找到该类,则说明您的给定集存在重叠。

关于mysql选择不在时间段内的行(由两列定义),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16866204/

相关文章:

sql - BigQuery - 连接每行的字符串数组

sql - 为什么这个 Join-Update 查询会更新所有值?

java - 使用数据库中的特定行填充 TableView

sql-server 分组

php - 一般错误 : 1005 when creating a key constraint - Laravel

mysql - 将 MySQL 表合并为一张表

mysql - 为什么此查询适用于 HAVING 但不适用于 WHERE(没有 GROUP BY)

php - Laravel 在模型保存时插入两次之间的差异

MySQL 自定义计算 View

php - 自定义函数从 mysql 查询中检索结果然后显示