Получить первый результат LEFT OUTER JOIN - PullRequest
0 голосов
/ 13 июня 2011

У меня есть этот запрос, чтобы получить все главные страницы и подстраницы этой страницы. Я использую этот запрос, а затем разделяю страницы, проверяя, есть ли на странице parent_id.

(разница между главной страницей и подстраницей в том, что главная страница имеет parent_id 0 и подстраницу> 0)

SELECT name, url_name, parent_id
FROM pages WHERE active = '1' AND visible = '1' AND deleted = '0'
AND ( parent_id = 0 OR parent_id = " . $main_page['id'] . ")
ORDER BY order_number DESC, id ASC

Теперь мне нужно получить ПЕРВУЮ подстраницу (упорядочив по номеру order_number) для каждой главной страницы.

Как бы я это сделал?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 13 июня 2011

попробуйте что-то вроде:

SELECT p1.name, p1.url_name, p1.parent_id, p2.id, p2.name, p2.url_name
FROM pages p1
LEFT OUTER JOIN pages p2
ON p2.parent_id = p1.id
WHERE p1.parent_id = 0
GROUP BY p1.id
ORDER BY p2.order_number ASC, p1.id ASC
0 голосов
/ 13 июня 2011

Это лучше всего решается в MySQL как исключающее соединение .Это очень похоже на многие вопросы, на которые дан ответ с помощью тега «наибольший n для группы» в StackOverflow.

SELECT p.name, p.url_name
FROM pages p
LEFT OUTER JOIN pages p2 ON p.order_number > p2.order_number
  AND (p2.parent_id, p2.active, p2.visible, p2.deleted) = ({$main_page["id"], 1, 1, 0) 
WHERE (p.parent_id, p.active, p.visible, p.deleted) = ({$main_page["id"]}, 1, 1, 0)
AND p2.id IS NULL;

Это решение ищет строку p2, которая имеет более низкий порядковый номер и в других случаях соответствует тем же условиямкак p.Если такая строка с более низким порядком не найдена, то p должен иметь самый низкий order_id из тех в той же группе, которая соответствует условию, то есть с тем же идентификатором parent_id.

Если у вас составной индекс на(parent_id, active, visible, удален, order_id), это должен быть очень эффективный запрос.

Одна часть этого решения, которую вы можете не ожидать, это то, что вам нужно повторить условия внутри левых критериев соединения.


Я отредактировал запрос выше после его тестирования.Теперь должно работать лучше.Обратите внимание, что это не сравнивает order_number подстраницы с порядковым номером ее родителя - он сравнивает order_number подстраницы с именем его родного элемента, то есть подстраниц того же родителя.

0 голосов
/ 13 июня 2011
SELECT * FROM pages 
WHERE id IN (
    SELECT max(id) FROM pages
    WHERE aive = '1' AND visible = '1' AND deleted = '0'
    GROUP BY parent_id
)
...