Проблема SQL LEFT JOIN - PullRequest
       9

Проблема SQL LEFT JOIN

1 голос
/ 05 августа 2010

Я пытаюсь выбрать самое последнее updated (поле) pages (таблица), за исключением страниц, которые скрыты (visible = "n"). Однако я хочу сгруппировать страницы по slug, поэтому я получаю только один результат на слаг.

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

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

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

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

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

Вы можете использовать это в подзапросе, если хотите присоединить эти идентификаторы к таблице страниц или добавить дополнительные поля - просто запомните правило, что каждый столбец в списке SELECT должен быть в 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'
)
1 голос
/ 05 августа 2010

Это должно работать:

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

PS Что со всеми обратными галочками?

...