当 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? [复制]

连接两种不同类型的表时 Tableau 中的自定义聚合

在 bigquery 中查询多个数据集中的表时遇到问题

在 MySQL 中使用 LEFT JOINing 多个表搜索多个值

连接两个以上的表时,Oracle 连接消除无法按预期工作

当加入一个非常小/空的表时,尽管我使用“LIMIT”,为啥 MySQL 会进行全面扫描?