Sql 多个子选择连接到同一个表? 背景

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 --------|-

我有一个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
--------|-------
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表达式。