不同的是,REGEXP适用于MYSQL中的Field和CONCAT_GROUP,用于删除重复的单词到存储过程

时间:2013-08-23 17:42:32

标签: mysql sql regex stored-procedures group-concat

上下文

我有下表(示例):

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

我需要把所有国家都放在一个领域,但我需要没有重复的价值。

所以,我尝试以下查询:

select GROUP_CONCAT(DISTINCT(COUNTRY)) FROM  Usuario;

或使用常规表达有些像:

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值不同值

感谢您的知识和时间!

3 个答案:

答案 0 :(得分:0)

没有办法让mysql像这样获得独特性。

首先,以这种方式存储值是不好的。

你有两个解决方案:

1-规范化您的数据库。

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

答案 1 :(得分:0)

在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函数,并返回一个包含逗号分隔列表的字符串值的单行。

答案 2 :(得分:0)

最初,您必须创建新的查找表,其中包含每行的国家/地区名称(此处为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;