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

MySQL-给定多个关联,如何获取多个记录的最新关联?,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,假设我有两个表(省略了不必要的行): 及 如果每个页面都有多个page\u版本s,我如何查询数据库,以便获得与其最新page\u版本关联的所有页面s 基本上: page_id | page_key | page_version | page_title | page_content 1 | home | 4 | Home | Dolor Sit... 2 | about | 5 | About

假设我有两个表(省略了不必要的行):

如果每个
页面
都有多个
page\u版本
s,我如何查询数据库,以便获得与其最新
page\u版本
关联的所有
页面
s

基本上:

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

您可以通过一个子选择先联接,然后按页面版本排序表,然后在其他组中选择它们

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`
您可以执行以下操作:

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)

我更喜欢将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这是MySQL实现GroupBy的巧合。如果将
SQL\u MODE=ONLY\u FULL\u GROUP\u设置为
,或者在几乎任何其他SQL实现中,此查询都将是错误的。
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)
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);