从mysql的逗号分隔文本列中查找不同的值[重复]

Posted

技术标签:

【中文标题】从mysql的逗号分隔文本列中查找不同的值[重复]【英文标题】:Find distinct values from comma separated text column of mysql [duplicate] 【发布时间】:2012-11-02 11:51:51 【问题描述】:

可能重复:Is storing a comma separated list in a database column really that bad?

我有一个逗号分隔文本的 mysql db 列:

  id  keys
 ------------
  1  Key1, Key2
  2  key3
  3  key2, key3, key4
  4  key5, key2

问题 1

我需要这样的结果:

id    keys
----------
1    Key1
2    Key2
3    key3
4    key4
5    key5

问题 2

我还需要第二个查询来匹配上述条件。例如。

选择所有带有key2的行

输出应该是

id
---
1
4

注意:仅在单个查询中,没有存储过程,没有函数。

我看到过类似的问题,但没有得到想要的答案。

注意:感谢您建议数据不应存储在逗号分隔的字段中。 但是我还没有开发系统和数据库。我正要进行小幅升级。

【问题讨论】:

为什么不想使用函数或存储过程? 为什么不正确存储数据(即:您希望结果如何成为问题 1)。 请阅读此内容:Is storing a comma separated list in a database column really that bad? 简短的回答是:是的,真的那么糟糕。 @ajreal 我知道它不能解决问题,但是限制允许使用的工具使得这几乎毫无意义。这可以通过使用函数来解决。 @champ 那么你对函数的宗教反对是什么? 【参考方案1】:

这是一个临时解决方案,直到您重新设计表格。由于CROSS JOIN,它的性能不会很好。它还需要创建一个新的“数字”表:

CREATE TABLE Number
  ( i INT PRIMARY KEY );

用不超过单元格中预期最大键数的数字填充它:

INSERT INTO Number
  VALUES
    (1), (2), ..., (1000) ;  

然后运行它以在逗号分隔的列中为您提供所有不同的键:

SELECT DISTINCT 
    SUBSTRING_INDEX(
          SUBSTRING_INDEX( 
                t.`keys`
              , ', '
              , n.i ) 
        , ', ' 
        , -1 ) AS `key`
FROM 
    Number AS n
  CROSS JOIN 
    YourTable AS t ;

测试于:SQL-Fiddle

【讨论】:

不确定这是否有效,但努力值得+1 @NicholasPickering Thnx。我在 SQLFiddle 添加了一个测试。

以上是关于从mysql的逗号分隔文本列中查找不同的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 的单个列中删除重复的逗号分隔值

如何将不同的逗号分隔值插入mysql中的不同列

MySQL函数替换列中的逗号分隔值

试图在列的每个单元格中查找重复的逗号分隔文本

如何在csv列中使用逗号[重复]

SQL查询以从逗号分隔的列中检索值[重复]