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

Posted

技术标签:

【中文标题】SQL查询以从逗号分隔的列中检索值[重复]【英文标题】:SQL query to retrieve values from a comma separated column [duplicate] 【发布时间】:2012-02-04 21:37:44 【问题描述】:

可能重复:Split string in SQLSearching a column with comma seperated values

在我的 PHP 项目中,我遇到了编写 SQL 的问题:

我有一个表“consultants”,其中包含 categories 字段,其值如下:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ id |  consultant_name  | categories                           +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+  1 |  AOAOAO           | health,insurance,programming,        +
+  2 |  BOBOBO           | health,gaming,windows,mobile,        +
+  3 |  CCCCCC           | insurance,windows,                   + 
+  4 |  DDDDDD           | mobile,                              +
+  . |  ......           | ............                         +
+  . |  ......           | ............                         +
+  . |  ......           | ............                         +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我有一个数组,其中包含顾问可以注册的所有类别

$arrayOfCategories =  $array("health","insurance","programming",
                             "sports","gaming","windows","apple",
                             "mobile","astrology");

我想要的是一个 SQL 查询,它应该给我一个输出,比如:

+++++++++++++++++++++++++++++++
+ category      | occurrence  +    
+++++++++++++++++++++++++++++++
+ health        | 2           +
+ insurance     | 2           +
+ programming   | 1           +
+ sports        | 0           +
+ gaming        | 1           +
+ windows       | 2           +
+ apple         | 0           +
+ mobile        | 2           +
+ astrology     | 0           +
+++++++++++++++++++++++++++++++

我们将不胜感激任何形式的帮助...

提前致谢...

【问题讨论】:

这就是所谓的糟糕的数据库设计。 @ShaktiSingh:是的,我同意你的看法。但是如果最后一次询问更改该怎么办。 你正在寻找与GROUP_CONCAT()相反的东西。 使用***.com/questions/8742093/… 将您的数据库架构转换为正常的东西 您确实应该考虑规范化您的顾问表。有了这种桌子,你总会有麻烦的! 【参考方案1】:

糟糕的数据库设计但有趣的问题,这是我的做法(php代码):

$arrayOfCategories =  $array("health","insurance","programming",
                             "sports","gaming","windows","apple",
                             "mobile","astrology");

 $count = count($arrayOfCategories);
 $query = "";
 for($i = 0; $i < $count; $i++)
 
   $value = $arrayOfCategories[$i];
   $query += "SELECT '$value' AS category,
                 COUNT(*) AS occurrence
                 FROM consultants
                 WHERE FIND_IN_SET('$value', categories)";
    if($i < $count -1) 
    $query += " UNION "
    


 

生成的查询的结果应该给你你想要的。糟糕的设计通常会带来有趣的问题...... :)

【讨论】:

谢谢老兄,它正在按照我的意愿完美运行...... :)【参考方案2】:

如果你有一个包含类别的表格,你可以这样做:

SELECT cat.name, COUNT(*) 
FROM categories cat JOIN consultants con ON con.categories LIKE '%'+cat.name+'%'

不过,我认为这很尴尬,您应该考虑规范化 db 方案,以便为顾问类别关系提供一个映射表

【讨论】:

如果一个类别是另一个类别的子字符串,查询当然会失败 如果是 like '%,'+cat.name+',%' 并且您确保 con.categories 在两端都有逗号,则不会。 @Ben 我知道,我只是认为这不值得打扰,因为这不是一件聪明的事情...... 我同意你的观点!从长远来看,花时间规范化架构会节省更多时间【参考方案3】:

这是一个糟糕的数据库设计。如果我坚持下去,我不会尝试使用 SQL 来获取事件,而是我的应用程序。

创建一个名为 $occurence 的新数组,它将包含每个单词的索引和计数。 选择每一行并用逗号分割类别的内容。循环遍历这个结果数组并为每个单词递增。

我对 PHP 有点生疏,所以这是我在 Perl 中的建议:

my %occurrence;

while ( my ($categories) = $sth->fetchrow_array() )

   my @cats = split(',', $categories);

   foreach my $c (@cats)
      $occurrence$c++;
   


这种方式的一个好处是您可以找到任何拼写错误的类别,并且在添加新类别时不必更新您的 SQL。

【讨论】:

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

包含逗号分隔值的列中的值

拆分和合并列中唯一的 SQL 逗号分隔值,然后分组

SQL Server 将三个不同的列连接成逗号分隔且没有重复值

在 Laravel 的列中使用连接和逗号分隔值执行查询

sql server 2008 group_Concat() 版本但是在不同的列中(不是逗号分隔)

如何将表中列中的逗号分隔值放入 SQL IN 运算符?