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

oknwwptz  于 2023-10-23  发布在  SQLite
关注(0)|答案(1)|浏览(138)

考虑下面的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

我如何简单地得到所有下一个calendar.start排序的events的列表?
最后,我将在events表上添加一些where子句(例如: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,但它似乎很复杂。我应该在calendar表上使用distinct吗?谢谢.

rkkpypqq

rkkpypqq1#

得到一个所有接下来的事件的列表按日历排序.开始
根据我对你想要实现的目标的理解,你不应该使用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是聚合行(至少通常是这样)。例如,让我们为每个剩余的事件获取meetup的数量:

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查询)获取下一个即将到来的会议的表,那么使用group by是正确的。当你说你在用min做实验时,我应该明白你想做什么。

SELECT id, text, min(start) AS upcoming 
FROM calendar 
INNER JOIN events using (id)
WHERE calendar.start > STRFTIME('%Y-%m-%d', 'now')
GROUP BY id
ORDER BY upcoming

会给你给予:

id      text    upcoming
--------------------------
id_2    world   2023-08-29
id_1    hello   2023-09-01

类似地,如果你想要每个事件的最后一次会议,你可以使用max

SELECT id, text, max(start) AS last_date 
FROM calendar 
INNER JOIN events using (id)
WHERE calendar.start > STRFTIME('%Y-%m-%d', 'now')
GROUP BY id
ORDER BY last_date

它给你:

id      text    last_date
--------------------------
id_1    hello   2023-10-01
id_2    world   2023-11-30

相关问题