0

语境:

我有下表(示例):

| 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 个值不同值的预期答案?

感谢您的知识和时间!

4

3 回答 3

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;
于 2013-12-04T14:12:52.713 回答
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 函数,并返回包含逗号分隔列表的字符串值的单行。

于 2013-08-23T18:24:48.747 回答
0

mysql 没有办法像这样变得独一无二。

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

你有两个解决方案:

1-规范化您的数据库。

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

于 2013-08-23T18:06:52.557 回答