当 LEFT JOINing 两个不同的表时,GROUP_CONCAT 接触了太多的重复值
Posted
技术标签:
【中文标题】当 LEFT JOINing 两个不同的表时,GROUP_CONCAT 接触了太多的重复值【英文标题】:GROUP CONCAT concats too much duplicate values when LEFT JOINing two different tables 【发布时间】:2016-07-15 11:30:43 【问题描述】:我有一个查询来获取我 LEFT JOIN 两个表的帖子:
类别和标签:LEFT JOIN 到链接表 → INNER JOIN 到类别和标签名称表。
LEFT JOIN wp_term_relationships AS term_link ON wpp.ID = term_link.object_id
INNER JOIN wp_terms AS terms ON term_link.term_taxonomy_id = terms.term_id
作为帖子元数据的额外帖子详细信息:
LEFT JOIN wp_postmeta AS postmeta ON wpp.ID = postmeta.post_id
现在。我想用逗号在一个列表中显示所有类别,使用 mysql GROUP_CONCAT:
GROUP_CONCAT(terms.name SEPARATOR ', ') AS allcatname
但是,问题是,由于我对 wp_postmeta 的第二次 LEFT JOIN,以某种方式为要找到的每个 wp_postmeta 记录复制了所有类别。所以我的“allcatname”看起来像这样:
饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料
所以发生了...我想保留 GROUP_CONCAT 的原因是因为我需要它来过滤“HAVING”。 所以我正在寻找一种方法,只显示与每个帖子链接的每个类别记录的一个类别:让组 concat 显示。例如。 “饮料、苏打水、可乐”,如果它具有这三个类别。
这是完整的查询:
SELECT
SQL_CALC_FOUND_ROWS
wpp.ID, wpp.post_title, wpp.post_author,
wpp.post_status,
GROUP_CONCAT(terms.name SEPARATOR ', ') AS allcatname
FROM wp_posts AS wpp
LEFT JOIN wp_term_relationships AS term_link ON wpp.ID = term_link.object_id
INNER JOIN wp_terms AS terms ON term_link.term_taxonomy_id = terms.term_id
LEFT JOIN wp_postmeta AS postmeta ON wpp.ID = postmeta.post_id
WHERE wpp.post_type = 'post'
AND wpp.post_warning <> 'no_image'
AND wpp.post_status <> 'trash'
AND wpp.post_status <> 'auto-draft'
AND (post_title LIKE '%$search_string%' OR postmeta.meta_value LIKE '%$search_string%')
GROUP BY wpp.ID
ORDER BY post_date DESC
LIMIT 20
【问题讨论】:
在这个查询中你在哪里使用postmeta
?
当用户执行特定搜索时,php 在 WHERE 注入此代码:AND (post_title LIKE '%textile%' OR postmeta.meta_value LIKE '%textile%')
【参考方案1】:
用途:
GROUP_CONCAT(DISTINCT terms.name SEPARATOR ', ') AS allcatname
代替:
GROUP_CONCAT(terms.name SEPARATOR ', ') AS allcatname
【讨论】:
这也解决了我的问题,使用DISTINCT
听起来很明显。但实际上为什么?以上是关于当 LEFT JOINing 两个不同的表时,GROUP_CONCAT 接触了太多的重复值的主要内容,如果未能解决你的问题,请参考以下文章
当涉及两个以上的表时,如何将来自相似字段的单个表的两个左连接转换为 LINQ? [复制]