上下文
我有下表(示例):
| 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值和不同值?
感谢您的知识和时间!
答案 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;