1

更新:私は本番環境で私の質問に示されている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に関連付けることを考えました。行を複製しますが、その方法がわかりません。

ありがとう

4

2 に答える 2

0

これは長くなります:(

GROUP BY を使用した最初の試みよりもパフォーマンスが悪かったため、最終的にこのアプローチを使用しなかったことに注意してください

PAGES テーブルのデータ テーブルのデザインを変更して、ページが属するサブセクションの ID を保持する新しい列を含める必要があったため、PAGES テーブルには、それが属するセクションとサブセクションを示す列が含まれるようになりました。その構造変更はテスト用であり、最終バージョンでは使用しませんでした。

これは、2 つのクエリ間の UNION の概念を使用して作成したクエリです。

SELECT
* 
FROM
  pages AS p
JOIN
-- create derived table of sections and subsections
  ( -- separate query to get sections (parent id = 0 )
    SELECT 
        s.id AS page_sec_id,
        s.id AS sec_id,
        s.name AS sec_name,
        NULL AS subsec_id,
        NULL AS subsec_name,
        s.parent_id AS parent_id
    FROM
        sections AS s
    WHERE
        s.parent_id = 0
   UNION
    -- separate query to get subsection (parent id != 0)
    SELECT
        ss.id AS page_sec_id,
        ss.parent_id AS sec_id,
        -- need to get section name, so had to use weird subquery
        (SELECT name FROM sections WHERE parent_id =0 AND id = ss.parent_id) AS sec_name,
        ss.id AS subsec_id,
        ss.name AS subsec_name,
        ss.parent_id AS parent_id
    FROM
        sections AS ss
    WHERE
        ss.parent_id != 0
   )  AS sss

ON
    -- specify how PAGES table is joined to this derived table of sections and subsections

    -- pages linked to sections only
        ( p.section_id = sss.sec_id AND p.subsection_id = 0 AND sss.parent_id = 0)
        OR
    -- pages linked to subsections only
        ( p.section_id = sss.sec_id AND p.subsection_id = sss.subsec_id )

この UNION クエリは 、5 行のページと 4 行のセクション/サブセクションに 0.0388 秒を使用したのに対し、元のクエリは 0.0017 秒を使用 ため、上記の質問に示すように元のクエリに固執しました。ところで、私の開発環境では、mysqlはP3 Katmai 450 Mhz 256 RAMで実行されており、効率的なクエリを作成する必要があります:)

読んでくれてありがとう。追加の考えやコメントがあれば、追加してください。

于 2012-11-02T18:35:50.673 に答える