将表连接到另一个表上的子查询,然后对结果进行排序

时间:2012-12-09 22:04:26

标签: sql database postgresql join

我是新来的,我非常感谢能帮助解决一直困扰我的问题。

考虑这两个表:

         albums (pkey: id)    years (pkey: album_id, year)

         id   genre_id       album_id  year
         ---  --------       --------  ---- 
         450      1           450      2000
         451      1           450      2001
         452      1           450      2002
         453      2           451      2005
         454      3           451      2012
                              452      1998

这可能看起来很奇怪,但请假设一张专辑可以与多年相关联。

我想选择流派1中的所有专辑,按照每张专辑的最新年份排序。 (假设可以按年份排序)。

所以,我想要这个结果:

 id    year
-----  ----
 451   2012
 450   2002
 452   1998

这就是我所在的地方......

显然,我需要在订购结果之前加入表格:

SELECT      id, year
FROM        albums INNER JOIN years ON albums.id = years.album_id
WHERE       genre_id = 1
ORDER BY    year;

这将选择流派1中每张专辑的每年记录,而不仅仅是流派1中每张专辑的最新年度记录。

不知何故,我需要合并一个子查询,如此,将加入专辑表的年份限制为仅限该专辑的最新年份,然后再次排序:

SELECT year FROM years WHERE album_id = ??? ORDER BY year DESC LIMIT 1;

3 个答案:

答案 0 :(得分:1)

这应该很简单:

SELECT album_id, MAX(year) 
  FROM years
 GROUP BY album_id
 ORDER BY MAX(year) DESC;

汇总功能max()允许您选择最近一年。由于您正在使用聚合函数,因此还需要group by子句。

如果您只需要某种类型的专辑,只需添加join声明。

答案 1 :(得分:1)

SELECT   album_id, max(year) latest
FROM albums INNER JOIN years ON id = album_id
WHERE genre_id = 1
GROUP BY album_id
ORDER BY latest DESC

答案 2 :(得分:0)

你可能想要的是

select
a.id,
( 
   select max(b.year) from years b where a.id = b.album_id
) as year
from 
albums a
where genre_id = 1
order by year