假设我有两个表(省略了非基本行):
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...
答案 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`
答案 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)