Distinct,REGEXP适用于MYSQL中的Field和CONCAT_GROUP来去除存储过程中的重复词

Posted

技术标签:

【中文标题】Distinct,REGEXP适用于MYSQL中的Field和CONCAT_GROUP来去除存储过程中的重复词【英文标题】:Distinct,REGEXP apply to Field and CONCAT_GROUP in MYSQL to remove repeated words to stored procedure 【发布时间】:2013-08-26 20:31:39 【问题描述】:

上下文:

我有下表(示例):

| ID  |   name   | COUNTRY                  |
---------------------------------------------
| 1   | cristian | FRANCIA,HOLANDA,ALEMANIA |
| 2   | Andrea   | FRANCIA,ESPAÑA,BELGICA   |
| 3   | F***   | BELGICA,ALEMANIA         |

我需要将所有国家/地区放在一个字段中,但我需要没有重复值。

所以,我正在尝试以下查询:

select GROUP_CONCAT(DISTINCT(COUNTRY)) FROM  Usuario;

或使用正则表达式 Some like :

select GROUP_CONCAT(DISTINCT(COUNTRY)) FROM  Usuario
WHERE GROUP_CONCAT(COUNTRY) REGEXP 'somepattern'

错误的答案是下一个:

FRANCIA,HOLANDA,ALEMANIA,FRANCIA,ESPAÑA,BELGICA,BELGICA,ALEMANIA

预期的答案是:

FRANCIA,HOLANDA,ALEMANIA,ESPAÑA,BELGICA

或者制作一些存储过程

如何得到预期的答案,对N个值不同的值

感谢您的知识和时间!

【问题讨论】:

你的表结构不好 对不起,我现在这是最好的方法,但我无法控制数据库。 【参考方案1】:

mysql 中没有内置函数可以做到这一点。

可以在 MySQL 中进行大量字符串处理,但它很难看,并且必须知道逗号分隔列表中字符串值的数量是有限的。

这是从所有逗号分隔列表中获取不同字段值列表的一种方法:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',1),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 UNION
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',2),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 UNION
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',3),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 UNION
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',4),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 UNION
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',5),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 UNION
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(country,','),',',6),',',-1) AS fld
  FROM mytable
HAVING fld <> ''
 ORDER BY 1

我将把它作为一个练习,让你弄清楚它在做什么以及它是如何工作的。

现在每个值都在单独的行中,我们认为您可能希望保持这种方式。

很容易将该查询包装在另一个查询中,并使用 GROUP_CONCAT 函数,并返回包含逗号分隔列表的字符串值的单行。

【讨论】:

有什么方法可以在 mysql 中创建一个 n 元素的过程吗?【参考方案2】:

mysql 无法像这种方式获得独特性。

首先,以这种方式存储值很糟糕。

你有两个解决方案:

1- 规范化您的数据库。

2-从表中获取值并使用 php explode() ,并使用 array_unique 删除重复值。

【讨论】:

【参考方案3】:

最初,您必须创建新的查找表,其中每行包含国家/地区名称(此处为 COUNTRY_TABLE)。 那就试试这个吧。

SELECT (SELECT GROUP_CONCAT(DISTINCT c.COUNTRYNAME) FROM  COUNTRY_TABLE AS c WHERE  FIND_IN_SET(c.COUNTRYNAME,COUNTRY) ) AS UNIQUECOUNTRYNAMES FROM Usuario;

【讨论】:

以上是关于Distinct,REGEXP适用于MYSQL中的Field和CONCAT_GROUP来去除存储过程中的重复词的主要内容,如果未能解决你的问题,请参考以下文章

COUNT(DISTINCT) 的百分位数与相关 WHERE 仅适用于视图(或没有 DISTINCT)

Linq distinct 方法仅适用于特定属性[重复]

MySQL REGEXP数字精确匹配不起作用

Postgres distinct union 仅适用于特定列

如何将distinct应用于特定列并从JPA中的表中获取所有值(Criteria Builder)

sql group by 与 distinct