2
SELECT

  GROUP_CONCAT(if(meta_summary = 'content', content, NULL)) AS content, 
  GROUP_CONCAT(if(meta_summary = 'supplemental', content, NULL)) AS supplemental,
  GROUP_CONCAT(if(meta_summary = 'heading', content, NULL)) AS heading,

cms_pages.meta_filename as filename

FROM
cms_pages

INNER JOIN cms_collection

ON

cms_collection.collection_id LIKE CONCAT('%', cms_pages.page_id,  '/heading%' )
OR cms_collection.collection_id LIKE CONCAT('%', cms_pages.page_id,  '/content%' )
OR cms_collection.collection_id LIKE CONCAT('%', cms_pages.page_id,  '/supplemental%' )

INNER JOIN

cms_content ON cms_collection.collection_id = cms_content.collection_id

WHERE
site_id = 51

GROUP BY
cms_pages.page_id

GROUP BY ののスキーマ:

Filename        Content

pageA           (Heading Content)
pageA           (Content)
pageA           (Supplemental Content)

望ましいルール セット:

Filename       Heading            Content          Supplemental
pageA          (Heading Content) (Content)         (Supp. Content)

http://www.artfulsoftware.com/infotree/queries.php#78を読んでみましたが、これがうまくいかない理由がわかりません - 行を誤ってグループ連結しているようです..いくつかは正しく、別のページのコンテンツと誤ってマージされたように見えるものもあります。これは、すべての結合のためにグループ連結でサブクエリを実行する必要があるためでしょうか?

更新 #1: sqlfiddle @ http://sqlfiddle.com/#!2/fe3e3/1を作成しましたが、実際にはそこで動作します..

a) ちゃんと作り直せなかった b) 多分 NaviCat が結果をめちゃくちゃにしてるんだけど、私はそれを疑っている

更新 #2:理由が見つかりました - それは、私が使用していた LIKE が (当然のことながら) 部分文字列に一致するためでした。そのため、「2/content」は「22/content」などと一致します。

cms_collection の INNER JOIN を効率的に変更して正確に一致させるにはどうすればよいですか?

4

1 に答える 1

1

次のように、LIKE 文字列一致結合条件の先頭からワイルドカードを削除してみてください。

SELECT
  GROUP_CONCAT(if(meta_summary = 'content', content, NULL)) AS content, 
  GROUP_CONCAT(if(meta_summary = 'supplemental', content, NULL)) AS supplemental,
  GROUP_CONCAT(if(meta_summary = 'heading', content, NULL)) AS heading,
  cms_pages.meta_filename as filename
FROM cms_pages
INNER JOIN cms_collection ON
  cms_collection.collection_id LIKE CONCAT(cms_pages.page_id, '/heading%')
  OR cms_collection.collection_id LIKE CONCAT(cms_pages.page_id, '/content%')
  OR cms_collection.collection_id LIKE CONCAT(cms_pages.page_id, '/supplemental%')
INNER JOIN
  cms_content ON cms_collection.collection_id = cms_content.collection_id
WHERE
  site_id = 53
GROUP BY
  cms_pages.page_id

ここでSQLFiddle 。

于 2013-06-13T15:02:35.967 に答える