2011-06-13 22 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