MySQL - 给定多个关联,如何获得多个记录的最新关联?

时间:2013-09-27 18:59:44

标签: mysql greatest-n-per-group

假设我有两个表(省略了非基本行):

Table `pages`
page_id | page_key 
      1 |     home
      2 |    about

Table `page_versions`
page_id | page_version | page_title | page_content
      1 |            2 |       Home | Lorem Ipsum...
      1 |            4 |       Home | Dolor Sit...
      2 |            3 |      About | Nunc Nisl...
      2 |            5 |      About | Proin Alt...

如果每个page有多个page_version,我该如何查询数据库,以便将所有page与最新的page_version相关联?

本质:

page_id | page_key | page_version | page_title | page_content
      1 |     home |            4 |       Home | Dolor Sit...
      2 |    about |            5 |      About | Proin Alt...

3 个答案:

答案 0 :(得分:2)

我更喜欢将FROM子句中的子查询作为派生表来执行,因此它只运行子查询一次。

SELECT p.page_id, p.page_key, pv.page_version, pv.page_title, pv.page_content 
FROM page_versions pv
INNER JOIN (SELECT page_id, MAX(page_version) AS page_version
    FROM page_versions GROUP BY page_id) AS max_page_versions
   USING (page_id, page_version)
INNER JOIN pages p USING (page_id);

与@FilipeSilva的答案进行比较,后者为外部查询的每一行执行一次相关子查询。这可能对性能不利。

答案 1 :(得分:0)

您可以使用子选择第一个连接执行此操作,然后按页面版本对其进行排序,然后在其他选择组中进行排序

SELECT * FROM (
SELECT p.*, ps.`page_version`,ps.`page_title`,ps.`page_content` FROM `page` p
LEFT JOIN  `page_versions` ps ON (p.`page_id`= ps.page_id) 
ORDER BY ps.`page_version` DESC ) newpage
GROUP BY newpage.`page_id`

See Updated fiddle here

答案 2 :(得分:0)

你可以这样做:

SELECT p.page_id, page_key, page_version, page_title, page_content 
FROM pages p
INNER JOIN page_versions pv ON pv.page_id = p.page_id
WHERE page_version = (SELECT MAX(page_version) 
                      FROM page_versions pv2 
                      WHERE pv2.page_id = pv.page_id)

SQLFIDDLE