Sql 多个子选择连接到同一个表? 背景
我有一个Postgres数据库,里面有节目(show_id int,title string)和剧集(show_id int,ep_id int,title string,date int) 我想发出一个查询,返回所有带有标题的节目、他们的集数(=以他们的id作为节目id的集数)、下一集标题和下一集播出时间。时间是Unix时间戳,下一集显然是Sql 多个子选择连接到同一个表? 背景,sql,postgresql,Sql,Postgresql,我有一个Postgres数据库,里面有节目(show_id int,title string)和剧集(show_id int,ep_id int,title string,date int) 我想发出一个查询,返回所有带有标题的节目、他们的集数(=以他们的id作为节目id的集数)、下一集标题和下一集播出时间。时间是Unix时间戳,下一集显然是min(date),其中date>now。如果节目没有即将播出的剧集,则这些字段为空 模式示例 显示: show_id | title --------|-
min(date),其中date>now
。如果节目没有即将播出的剧集,则这些字段为空
模式示例
显示:
show_id | title
--------|-------
1 | The X-Files
2 | Fringe
3 | Seinfeld
剧集:
ep_id | title | date | show_id
------|-------------------|-----------|---------
1 | Mulder's Holiday | 110876621 | 1
2 | Walt Retires | 128101332 | 2
3 | Kramer & Dracula | 184220112 | 3
4 | Scully's Tattoo | 100298110 | 1
5 | Skinner in Hawaii | 218101310 | 1
期望结果集
我试过的
第一个内部联接起作用,用于选择剧集计数,但复制它以选择下一个剧集标题和日期不起作用。问题似乎是,只有当您选择的是聚合函数的一部分时,子选择上的内部联接才起作用?或者类似的东西——我的书没有涵盖这一点,我在谷歌上度过了半个晚上后,发现自己很难弄明白。如果有人能告诉我如何做,我将不胜感激。在第二个内部连接中,您应该使用distiinct,而不是group by。。你没有聚合功能吗
select s.title, c.count, d.next_episode, d.next_airing
from shows s
inner join (select show_id, count(*)
from episodes
group by show_id) on c.show_id = s.show_id
inner join (select distinct show_id, title next_next_episode, date next_airing
from episodes
) d on d.show_id = s.show_id
我已使用SQL格式上的联接安排查询。。希望这不再是您的db代码规则,在第二个内部联接中,您应该使用distiinct,而不是group by。。你没有聚合功能吗
select s.title, c.count, d.next_episode, d.next_airing
from shows s
inner join (select show_id, count(*)
from episodes
group by show_id) on c.show_id = s.show_id
inner join (select distinct show_id, title next_next_episode, date next_airing
from episodes
) d on d.show_id = s.show_id
我已使用SQL格式上的联接安排查询。。希望这不再是您的db代码规则这有点棘手。首先,您需要一个日期过滤器。第二,您需要外部联接,以防没有下一集。请尝试以下版本:
select s.show_id, e.episode_count, enext.title, enext.date
from shows s left join
(select show_id, count(*) as episode_count
from episodes e
group by show_id
) e left join
(select distinct on (ep_id) e.*
from episodes e
where date > extract(epoch from now())
order by ep_id, date
) enext
on enext.show_id = s.show_id;
这有点棘手。首先,您需要一个日期过滤器。第二,您需要外部联接,以防没有下一集。请尝试以下版本:
select s.show_id, e.episode_count, enext.title, enext.date
from shows s left join
(select show_id, count(*) as episode_count
from episodes e
group by show_id
) e left join
(select distinct on (ep_id) e.*
from episodes e
where date > extract(epoch from now())
order by ep_id, date
) enext
on enext.show_id = s.show_id;
不幸的是,这似乎是一个语法错误,我不知道为什么或在哪里。@GreenTriangle。出于某些原因,我将unix时间戳的MySQL函数替换为Postgres表达式。不幸的是,这似乎是一个语法错误,我无法解释原因或位置。@GreenTriangle。出于某些原因,我将unix时间戳的MySQL函数替换为Postgres表达式。