我有这个查询来检索该页面的所有主页和子页面。我使用此查询,然后通过检查页面是否有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
现在我需要为每个主页面获取FIRST子页面(通过order_number排序)。
我该怎么做?
提前致谢。
答案 0 :(得分: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
)
答案 1 :(得分: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
答案 2 :(得分:0)
这最好在MySQL中作为排除连接解决。这与在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
,其行order_id较低,并且与p
的条件相同。如果找不到这样的低阶行,则p
必须具有与该条件匹配的同一组中最低的order_id,即具有相同parent_id的那些。
如果你有一个复合索引(parent_id,active,visible,deleted,order_id),这应该是一个非常有效的查询。
您可能不会期望此解决方案的一部分是您需要重复左连接条件内的条件。
我在测试之后编辑了上面的查询。它现在应该更好。请注意,这并不是将子页面的order_number与其父级的order_number进行比较 - 它将子页面的order_number与其兄弟页面的order_number进行比较,即同一父级的子页面。