JOINing后错误地旋转表格?

时间:2013-06-13 06:15:01

标签: mysql sql pivot-table

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

架构 BEFORE 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,但无法弄清楚为什么这对我不起作用 - 似乎是错误的组连接行...有些是正确的,有些看起来像是错误地与来自内容的内容合并另一页。这可能是因为我需要使用群组concat做一个子查询,因为我的所有联接?

更新#1:创建了一个@lf http://sqlfiddle.com/#!2/fe3e3/1,但它实际上在那里工作..

a)我没有正确地重新创建它 b)也许是NaviCat搞砸了结果,尽管我怀疑它

更新#2:找到原因 - 这是因为我使用的LIKE(正确地)匹配子串,因此'2 / content'将匹配'22 / content'等等。

如何以有效的方式更改cms_collection上的INNER JOIN以进行完全匹配?

1 个答案:

答案 0 :(得分:1)

尝试从LIKE字符串匹配连接条件的 start 中删除通配符,如下所示:

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 here