1

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

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_versions,我如何查询数据库以使所有pages 与它们的最新相关联page_version

本质上:

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

3 回答 3

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 的答案进行比较,后者为外部查询的每一行执行一次相关子查询。这可能对性能不利。

于 2013-09-27T19:29:40.657 回答
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`

请参阅此处更新的小提琴

于 2013-09-27T19:11:56.203 回答
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

于 2013-09-27T19:14:14.547 回答