2012-01-07 57 views
4

可能重复:
Split string in SQL
Searching a column with comma seperated valuesSQL查询来从逗号检索值分隔栏

在我PHP项目中,我面临的一个问题写SQL :

我有一个表“consulta NTS“包含字段类别具有类似的值:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 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   + 
+++++++++++++++++++++++++++++++ 

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

在此先感谢.. 。

+8

这就是所谓的不良数据库设计。 – 2012-01-07 13:27:12

+0

@ShaktiSingh:是的,我同意你的意见。但如果最后一次要求更改,该怎么办。 – PhpStudent 2012-01-07 13:28:19

+0

您正在寻找['GROUP_CONCAT()'](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat)的相反部分。 – hakre 2012-01-07 13:30:43

回答

2

数据库设计的不好,但有趣的问题,这是我的方式做(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 " 
    } 


} 

生成的查询S的结果应该准确地给你想要的东西。通常从不好的设计来的有趣的问题... :)

+0

谢谢你,他的工作完美,因为我想... :) – PhpStudent 2012-01-07 14:53:46

1

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

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

我所以这里在PHP有点生疏是我在Perl建议:

my %occurrence; 

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

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

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

} 

一个的这种方式,你会发现任何拼写错误的类别和没有更新您的SQL的好处当一个新的类别被添加。

0

如果您有相关的类别表,你可以做这样的:

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

不过,我认为这是尴尬的,你应该考虑标准化的数据库方案,以便有一个映射表consultant-类别关系

+0

如果一个类别是另一个类别的子字符串,该查询当然会失败 – voidengine 2012-01-07 13:42:08

+0

如果它是'like'%,'+ cat.name +',%'',并且您确保'con.categories'有逗号在任何一端。 – Ben 2012-01-07 13:52:08

+0

@Ben我知道,我不认为这是值得打扰,因为这不是一个聪明的事情做反正... – voidengine 2012-01-07 13:57:32