更新:我在生产中使用我的问题中显示的 sql 查询,但是如果您想查看另一种方法,请阅读整个线程,使用带有 UNION 的 sql
我已经试验并制作了一个用于内容搜索的结果集,但我想确保它的性能是最好的。
我有一个名为 SECTIONS 的表,它在邻接列表模型中包含 2 个级别的部分,即级别 1(一个部分)和级别 2(一个子部分)
SECTIONS: id, parent_id, name
我查询该表两次以获取排列中的列
sec_id, sec_name, subsec_id, subsec_name
(这样我就可以创建像 /section_id/subsection_id 这样的 uri 链接)
现在我加入一个名为 PAGES 的单独表,其中一个页面可以通过字段 section_id 与一个部分或一个子部分(两者都不是)相关联
-- columns to return
SELECT
s.id as section_id,
s.name as section_name,
ss.id as subsection_id,
ss.parent_id as subsection_parent_id,
ss.name as subsection_name,
p.section_id as page_section_id,
p.name as page_name
-- join SECTIONS into Sections and SubSections
FROM
( select id, name from sections where parent_id=0 ) as s
LEFT JOIN
( select id, parent_id, name from sections where parent_id!=0 ) as ss
ON
ss.parent_id = s.id
-- now join to PAGES table
JOIN
( select id, section_id, name from pages where active=1 ) as p
ON
(
p.section_id = s.id
OR
p.section_id = ss.id
)
-- need to use GROUP BY to eliminate duplicate pages
GROUP BY p.id
我在结果集中得到了重复的页面,所以我使用 GROUP BY pages.id 来删除重复的页面,但这会稍微降低性能。
你能建议一个更好的方法来消除重复吗?
我已经考虑在 SECTIONS 连接中创建一个包含 Section ID 或 Subsection ID 的列(取决于行的类型 - 部分或子部分),然后使用它与 PAGES section_id 相关联,所以不会有重复的行,但我不知道该怎么做。
谢谢