从id_numbers列获取唯一的Id编号,但是从多行MySQL获取

时间:2015-01-08 04:04:14

标签: php mysql

我有一张表,它有一个名为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()

将其与PHP循环

请帮助,我只需要使用MySQL。在此先感谢。

1 个答案:

答案 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中这样做。这样做会对关系数据库模型产生暴力。