LEFT JOIN两个不同的表时,GROUP CONCAT会重复过多的重复值

时间:2016-03-28 08:08:09

标签: mysql left-join group-concat

我有一个查询来获取我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

然而,问题是,由于我的第二次LEFT JOIN到wp_postmeta,不知何故,所有类别都会被复制,以便找到每个wp_postmeta记录。所以我的全部名称'看起来像这样:

  

饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料,饮料

发生了这种情况......
我想保留GROUP_CONCAT的原因是因为我需要它来过滤" HAVING"。 因此,我正在寻找一种方法,只显示与每个帖子相关联的每个类别记录的一个类别:让小组连续显示。例如。 "饮料,苏打水,可乐"如果它有这三个类别。

以下是完整的查询:

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

1 个答案:

答案 0 :(得分:4)

使用:

GROUP_CONCAT(DISTINCT terms.name SEPARATOR ', ') AS allcatname

而不是:

GROUP_CONCAT(terms.name SEPARATOR ', ') AS allcatname