2011-06-13 52 views
0

我有這個查詢來檢索該頁面的所有主頁和子頁面。我使用這個查詢,然後通過檢查頁面是否有parent_id來分隔頁面。檢索第一個結果的左外部聯接

(主頁和子頁之間的不同之處在於主頁有0 PARENT_ID和子頁> 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排序)爲每個主頁面。

我該怎麼做?

在此先感謝。

+0

此查詢如何工作?你沒有在你的FROM語句中定義別​​名'p'。 – 2011-06-13 13:50:41

+0

對不起,該帖子已被編輯。 $ main_page ['id']是CURRENT主頁ID – Jesse 2011-06-13 13:57:07

+0

我想這取決於「FIRST」子頁面的定義。是什麼讓子頁面成爲第一個呢?最低/最高ID?其他一些列? – 2011-06-13 14:05:55

回答

0
SELECT * FROM pages 
WHERE id IN (
    SELECT max(id) FROM pages 
    WHERE aive = '1' AND visible = '1' AND deleted = '0' 
    GROUP BY parent_id 
) 
0

嘗試類似:

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

在MySQL中加入這是最好的解決作爲排除。這與StackOverflow中每個組的最大n-tag標籤下回答的許多問題非常相似。

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進行比較,即相同父節點的子頁面。

+0

這將返回0個結果。我不確定這是否能解決我的問題。主頁和孩子的order_number與海誓山盟無關。我只需要獲取每個主頁中具有最高order_number的一個子頁面 – Jesse 2011-06-13 15:29:28