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 Server 将三个不同的列连接成逗号分隔且没有重复值