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)
Postgres distinct union 仅适用于特定列