`order by` 和 `group` by 在 `inner join` SQLite 查询中

问题描述 投票:0回答:1

考虑下面的 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
桌上吗?谢谢。

sqlite join group-by sql-order-by
1个回答
0
投票

获取按 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 查询将更加复杂

© www.soinside.com 2019 - 2024. All rights reserved.