[英]Retrieve first result of LEFT OUTER JOIN
我有這個查詢來檢索該頁面的所有主頁面和子頁面。 我使用這個查詢,然后通過檢查頁面是否有 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 排序)。
我該怎么做?
提前致謝。
SELECT * FROM pages
WHERE id IN (
SELECT max(id) FROM pages
WHERE aive = '1' AND visible = '1' AND deleted = '0'
GROUP BY parent_id
)
嘗試類似:
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
這最好在 MySQL 作為排除連接來解決。 這與 StackOverflow 上的每個組的最大 n 標記下回答的許多問題非常相似。
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;
此解決方案查找具有較低 order_id 並且與p
匹配相同條件的行p2
。 如果沒有找到這樣的低序行,則p
必須具有與條件匹配的同一組中的最低 order_id,即具有相同 parent_id 的那些。
如果您在 (parent_id, active, visible, deleted, order_id) 上有一個復合索引,這應該是一個非常有效的查詢。
此解決方案中您可能沒有想到的一部分是您需要重復左連接條件內的條件。
我在測試后編輯了上面的查詢。 它現在應該工作得更好。 請注意,這不是將子頁面的 order_number 與其父頁面的 order_number 進行比較,而是將子頁面的 order_number 與其兄弟的 order_number 進行比較,即同一父頁面的子頁面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.