我有一张表,它有一个名为id_numbers
的列,逗号分隔数字
ID | id_numbers
_______________
1 | 1,2,3,4,5
2 | 2,3,4,5,6
3 | 3,4,5,6,7
我希望从表格的每一行获得唯一的id_numbers
。在我的情况下它应该是
1,2,3,4,5,6,7
我用
说SELECT GROUP_CONCAT(id_numbers SEPARATOR ',') FROM my_table
但是我在这里得到重复的vales,我搜索但是我发现文章说我不能只使用MySQL做这个。是否可以在MySQL中执行此操作?我是否必须使用explode()
和array_unique()
请帮助,我只需要使用MySQL。在此先感谢。
答案 0 :(得分:1)
从所有字符串生成一个不同的“数字”列表:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.id_numbers,',',d.i+1),',',-1) AS n
FROM mytable t
JOIN ( SELECT 0 AS i
UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) d
ON d.i <= ( CHAR_LENGTH(t.id_numbers)
- CHAR_LENGTH(REPLACE(t.id_numbers,',','')) )
GROUP BY n
HAVING n <> ''
把它放回逗号分隔的列表中(ARRGGHH!我们为什么要这样做?),我们可以使用上面的查询作为内联视图......
SELECT GROUP_CONCAT(q.n ORDER BY q.n+0) AS id_numbers
FROM ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.id_numbers,',',d.i+1),',',-1) AS n
FROM mytable t
JOIN ( SELECT 0 AS i
UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) d
ON d.i <= ( CHAR_LENGTH(t.id_numbers)
- CHAR_LENGTH(REPLACE(t.id_numbers,',','')) )
GROUP BY n
HAVING n <> ''
) q
这与Mark确定为可能重复的问题的答案基本相同。
我不打算解释所有这些是如何工作的,而是建议您避免将逗号分隔的值列表存储为字符串。
我建议你看看Bill Karwin的优秀书籍“SQL反模式:避免数据库编程的陷阱”第2章。
http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557
你看到的那些文章说这不能在MySQL中完成,那些文章本质上是正确的......你不能在SQL中这样做,因为你不想在SQL中这样做。这样做会对关系数据库模型产生暴力。