如何避免在GROUP_CONCAT中出现重复?

25
我有一个问题,如果它们属于同一组,就需要串联字符串。
    SELECT e.id, 
        ke.value,
        re.value AS re_value,
        GROUP_CONCAT(g.value,', ')
        FROM entry e
                INNER JOIN k_ele ke ON e.id = ke.fk
                INNER JOIN r_ele re ON e.id = re.fk
                INNER JOIN sense s ON e.id = s.fk
                INNER JOIN gloss g ON s.id = g.fk
WHERE g.lang IS NULL
GROUP BY s.id
ORDER BY re_value

但是

GROUP_CONCAT(DISTINCT g.value, ', ')

会得到这个结果。

亲密关系,爱情关系

可以看到连接中存在重复。如何避免连接中的重复项?

2个回答

54
GROUP_CONCAT(DISTINCT g.value)

10
在SQLite中,使用GROUP_CONCAT(DISTINCT)时无法指定分隔符,虽然这个函数可以工作,但如果你想改变默认的,分隔符,你可以采用CL答案中展示的子查询方法,或者使用替换方法(我认为子查询方法更好)。 - GarethD
10
我必须将这个东西塞进一个已经很糟糕的查询中,所以我选择了replace(GROUP_CONCAT(DISTINCT g.value), ',', the_delimiter)。虽然很糟糕,但我想快速展示一种应对其他分隔符和非常大的查询子句困境的方法。然而,使用此方法前请确保你的值内不含逗号。 - Kelly
对于大数据,子查询是正确的处理方式。在这种情况下,Distinct 只是一种 hack 方法。 - Muhammad Babar

8

在应用GROUP_CONCAT之前,您必须删除重复项,这通常需要使用子查询:

SELECT a, GROUP_CONCAT(b)
FROM (SELECT DISTINCT a, b
      FROM MyTable)
GROUP BY a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接