考虑下面的 SQLite DB 表和这个 DBFiddle:
events
桌子
id | text
---------
id_1 | hello
id_2 | world
calendar
桌子
id | start
---------------
id_1 | 2023-01-01
id_1 | 2023-06-01
id_1 | 2023-09-01
id_1 | 2023-10-01
id_2 | 2023-05-01
id_2 | 2023-08-29
id_2 | 2023-10-30
id_2 | 2023-11-30
如何简单地获取按
events
订购的所有下一个 calendar.start
的列表?where
表上添加一些 events
子句(例如 where status = 'published'
)
我尝试过:
select * from events
inner join calendar using (id)
where calendar.start > STRFTIME('%Y-%m-%d', 'now')
group by id
但是我正在与
order by
作斗争(不能在 group by
之后或之前)。我尝试使用 min
但看起来很复杂。我应该将 distinct
放在 calendar
桌上吗?谢谢。
获取按 calendar.start 排序的所有接下来发生的事件的列表
根据我对你想要实现的目标的理解,你不应该使用group by。 Group By 用于聚合数据,例如计算列数或将列添加在一起。
您的语句只会返回 2 行(即根据您的表,事件数为 2。
select * from events
inner join calendar using (id)
where calendar.start > STRFTIME('%Y-%m-%d', 'now')
ORDER BY calendar.start
将为您提供与重复发生的事件相关的日历列表
即
id text start
--------------------------
id_2 world 2023-08-29
id_1 hello 2023-09-01
id_1 hello 2023-10-01
id_2 world 2023-10-30
id_2 world 2023-11-30
正如我之前提到的,Group by 是聚合行(至少通常是这样)。例如,让我们获取每个剩余活动的聚会数量:
select calendar.id, events.text, count(*) as num_events_remaining
from events
inner join calendar using (id)
where calendar.start > STRFTIME('%Y-%m-%d', 'now')
group by id
结果:
id text num_events_remaining
------------------------------------
id_1 hello 2
id_2 world 3
如果您想要一个表来获取每个事件的下一个即将举行的会议,则 SQL 查询将更加复杂