【问题标题】:Finding first pending events from SQL table从 SQL 表中查找第一个待处理事件
【发布时间】:2012-06-25 19:30:29
【问题描述】:

我有一个包含电视指南数据的表。

在简化形式中,列如下所示...

_id, title, start_time, end_time, channel_id

我要做的是创建一个 NOW/NEXT 格式的电视节目列表。生成“NOW”列表(当前正在广播的内容)很容易,但尝试获取显示“NEXT”的内容列表会给我带来问题。

我试过了……

SELECT * from TV_GUIDE where start_time >= datetime('now') GROUP BY channel_id

果然,这给了我一个电视节目channel_id,但它给了我TV_GUIDE 表中的最后一个节目(按日期/时间)。

SQL 不是我的强项,我正在努力找出为什么只返回最后的电视节目。看来我需要做一个查询的子查询(或子查询的查询)。我尝试了 ORDER BYLIMIT 的组合,但它们没有帮助。

【问题讨论】:

  • 您不应选择未出现在 group by 子句中的列,除非它们位于聚合函数中。你也应该避免SELECT *

标签: sql sqlite


【解决方案1】:

我认为您首先必须根据您的标准从 TV_GUIDE 中选择情侣 (channel_id, )。 然后,您将显示符合这些条件的 TV_GUIDE 记录:

SELECT source.* from TV_GUIDE AS source
JOIN (SELECT channel_id, MIN(start_time) AS start_time
    FROM TV_GUIDE
    WHERE start_time >=  now() GROUP BY channel_id ) AS start_times
ON (source.channel_id = start_times.channel_id 
    AND source.start_time = start_times.start_time)
ORDER BY channel_id;

首先选择所有具有最短开始时间的节目,每个频道一个,从而为您提供频道 ID 和开始时间。然后从同一个表的 JOIN 中填写其他信息(MySQL 有时允许您从单个查询中检索该信息,但我觉得获取它是一个坏习惯 - 也许您添加了一个字段,它不再起作用)。

您可能希望在组合字段(start_time、channel_id)上添加索引。为了安全起见,请将其设为唯一索引。

【讨论】:

  • +1 我认为您的回答可能是正确的,但我需要仔细检查以确保所有数据都正确返回。现在已经很晚了,所以我稍后再试,但第一次测试表明它正在工作。非常感谢。
猜你喜欢
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2015-06-03
  • 1970-01-01
  • 2017-03-04
相关资源
最近更新 更多