2010-08-04 123 views
1

我試圖選擇最新的updated(字段)pages(表格),不包括隱藏的頁面(visible =「n」)。但是,我想通過slug對頁面進行分組,因此每個子彈只能得到一個結果。SQL LEFT JOIN問題

下面的查詢有點兒工作,但它只會選擇對每個塞最新更新的頁面 - 那麼,如果該頁面恰好被隱藏,它從結果:(刪除它在這種情況下,我只是想與塞最新更新頁面可見。

SELECT `p1`.`id` AS `pID`, `p1`.`slug` AS `url`, `p1`.`revision`, `p1`.`title`, `p1`.`published`, `p1`.`updated`, (SELECT COUNT(*) FROM `pages` WHERE `slug` = `url` AND `visible` = "y") AS `revisionCount`, (SELECT COUNT(*) FROM `tests` WHERE `pageID` = `pID`) AS `testCount` 
FROM `pages` `p1` 
LEFT JOIN `pages` `p2` ON `p1`.`slug` = `p2`.`slug` AND `p1`.`updated` < `p2`.`updated` 
WHERE `p2`.`updated` IS NULL AND `p1`.`visible` = "y" 
ORDER BY `p1`.`updated` DESC 
+0

所以你想要每個slu latest的最新更新和可見頁?我猜更新是一個日期或int? – MrSoundless 2010-08-04 23:34:50

+0

@MrSoundless:更新日期 – naburi 2010-08-05 00:09:28

回答

1

這應該工作:

SELECT id AS pID, slug AS url, revision, title, published, updated, (SELECT COUNT(*) FROM pages WHERE slug = url AND visible = "y") AS revisionCount, (SELECT COUNT(*) FROM tests WHERE pageID = pID) AS testCount 
FROM pages 
WHERE updated IN (SELECT MAX(updated) FROM pages WHERE visible = "y" GROUP BY slug) AND visible = "y" 
ORDER BY updated DESC 

附:什麼是反引號?

2

這是GROUP BY的經典案例。而且因爲在你的情況下,你甚至不想頁認爲除非它是「看得見',你將使用WHERE子句而不是HAVING子句。

SELECT MAX(id) as highest_id_for_slug, slug 
FROM pages 
GROUP BY slug 
WHERE visible = 'y' 

您可以在子查詢中使用,如果你想加入這些ID的頁面表,或者添加附加字段 - 只記得,在SELECT列表中的每一列必須在GROUP BY的規則,或者對其應用匯總。

​​