2010-08-04 1 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

, так что вам нужна последняя обновленная и видимая страница для каждого слизняка? и, я думаю, обновленная дата или int? – MrSoundless

+0

@MrSoundless: обновлена ​​дата – naburi

ответ

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 

P.S. Что со всеми backticks?

2

Это классический случай для GROUP BY. И потому, что в вашем случае, если вы даже не хотите страницы считается, если она не является «видимой ', вы будете использовать предложение WHERE, а не предложение HAVING.

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

Вы можете использовать это в подзапросе, если вы хотите присоединиться к этим идентификаторам к таблице страниц, или добавить дополнительные поля - просто помнить правило, что каждый столбец в списке выбора должен быть в GROUP BY, или иметь совокупность, применяемую к нему.

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