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

可能重复:
Split string in SQL
Searching 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()相反的东西。
  • 使用stackoverflow.com/questions/8742093/… 将您的数据库架构转换为正常的东西
  • 您确实应该考虑规范化您的顾问表。有了这种桌子,你总会有麻烦的!

标签: php mysql sql zend-framework select


【解决方案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。

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 2014-01-15
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多