更新:私は本番環境で私の質問に示されているSQLクエリを使用していますが、UNIONでSQLを使用して、これに対する別のアプローチを見たい場合は、スレッド全体を読んでください。
コンテンツ検索で使用する結果セットを実験して作成しましたが、パフォーマンスが最高であることを確認したいと考えています。
セクションの 2 つのレベル、つまりレベル 1 (セクション) とレベル 2 (サブセクション) を隣接リスト モデルに保持する SECTIONS という名前のテーブルがあります。
SECTIONS: id, parent_id, name
そのテーブルを 2 回クエリして、配列内の列を取得します
sec_id, sec_name, subsec_id, subsec_name
(これは /section_id/subsection_id のような uri リンクを作成できるようにするためです)
ここで、フィールド section_id を介してセクションまたはサブセクション (両方ではない) にページを関連付けることができる PAGES という名前の別のテーブルに参加します。
-- 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 を使って重複を取り除いていますが、少しパフォーマンスが低下します。
重複を排除するためのより良い方法を提案できますか?
セクションIDまたはサブセクションID(行のタイプ-セクションまたはサブセクションに応じて)を保持するSECTIONS結合に列を作成し、それを使用してPAGES section_idに関連付けることを考えました。行を複製しますが、その方法がわかりません。
ありがとう