我有一个包含多行的MySQL数据库和一个包含一些文本的列,用逗号分隔。
为了快速了解,我的数据库看起来像这样:
id | column
1 | aaa, bbb
2 | ccc, ddd, aaa
3 | eee, aaa, ccc
4 | ddd
输出必须如下:
aaa - 3
bbb - 1
ccc - 2
ddd - 2
eee - 1
我搜索了整个互联网后,我仍然不知道该怎么做。 请善待并给我一些解决它的想法。
答案 0 :(得分:0)
假设您有数据结构的原因并且您不愿意规范化数据库,那么您需要在PHP中执行此操作,但是如果没有原因,我强烈建议进行规范化。
{{1}}
答案 1 :(得分:0)
// This will come from the query, but for the example
$array = Array("aaa, bbb", "ccc, ddd, aaa", "eee, aaa, ccc", "ddd");
print_r(array_count_values($array));
// you will get associative array with count.
答案 2 :(得分:0)
规范化您的数据库是最佳解决方案,这绝非易事。 此外,正如其他答案所示,实现上述任务 programmaticaly 也将是一个简单而有效的解决方案。
但如果以上两个选项根本不适合您,那么可以通过 PL \ SQL 来实现以下选项。
1)如果您只想一次找到单个字的出现次数,可以尝试以下方式:
select
distinct
'aaa' as Word,
ROUND (
(
CHAR_LENGTH(@str)
- CHAR_LENGTH( REPLACE (@str, 'aaa', "") ) //you can put the word here you want
) / CHAR_LENGTH('aaa')
) AS count
from t
;
<强>结果:强>
word | count
--------------
aaa | 3
2)如果您想显示相关字词的所有字词数,则需要功能,过程, 临时表。
第1步:创建临时表。
create table temp(str varchar(10));
第2步:使用指定位置的分隔符,
为拆分数据创建功能。
CREATE FUNCTION SPLIT_STR
(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
现在,上述函数将仅为给定位置分割数据。为了拆分整个字符串,我们需要迭代这个函数。那是我们的第3步。
第3步:创建过程以迭代上述功能;
CREATE PROCEDURE ABC(IN fullstr varchar(1000))
BEGIN
DECLARE a INT Default 0;
DECLARE str VARCHAR(255);
simple_loop: LOOP
SET a=a+1;
SET str=SPLIT_STR(fullstr,",",a);
IF str='' THEN
LEAVE simple_loop;
END IF;
#Do Inserts into temp table here with str going into the row
insert into t1 values (str);
END LOOP simple_loop;
第4步:将整栏存储到一个变量中:
select @str:= group_concat(columnname separator ',') from t;
第5步:致电程序:
call abc(@str);
第6步:从temp
表中获取计数:
select
str as word,
count(*) as occurence
from temp
group by str;
<强>结果:强>
word | occurence
-------------------------
1 aaa | 3
2 bbb | 1
3 ccc | 2
4 ddd | 2
5 eee | 1
希望它有所帮助!
答案 3 :(得分:0)
谢谢你们,伙计们。
根据你们的想法,我制作了一个糟糕的脚本来完成工作,没有修改DB。我的数据库已经规范化了,除了一个表中的一列(女巫不像我的例子中那样设计)。我将在这里描述脚本,以供将来需要它的用户使用。
我的专栏只能包含0-5个预定义的单词,逗号分隔。
对于每个单词,我用他的名字分配了一个$ var。然后,在MySQL的while循环中,我检查字符串是否包含该单词。
if(strpos($domeniu,'Producator') !== false){$producator = $producator + $count_domeniu;}
。
为每个单词重复代码
Producator 是5中的一个词,早于预先定义。
$ producator 是$ var定义0,在while循环之前。
$ count_domeniu = $ row ['count_domeniu'];
在While循环之后,echo $ producator var。
我的mysql查询是("SELECT domeniu_activitate, COUNT(domeniu_activitate) as count_domeniu FROM tbl_expozanti GROUP BY domeniu_activitate")
。
答案 4 :(得分:0)
这是一个古老的问题,但是在遇到相同的问题时,我也在寻找答案的同时落在这里,以便其他人也可以。终于找到了适合自己的完美答案,它也可以通过简单的MySQL查询方式为您服务。因此,这是一个简单的查询,用于计算用逗号分隔的多个行值。
根据您的表,数据以某种方式构造为...
id | column
1 | aaa, bbb
2 | ccc, ddd, aaa
3 | eee, aaa, ccc
4 | ddd
所以要获得答案,只需使用以下查询...
SELECT substring_index(column, ',', -1) AS columnTextRenamed, COUNT(substring_index(column, ',', -1)) AS columnCountRenamed
FROM my_table_name
GROUP BY columnTextRenamed
ORDER BY columnTextRenamed;
然后这将输出为...
columnTextRenamed | columnCountRenamed
aaa | 3
bbb | 1
ccc | 2
ddd | 2
eee | 1
这就是您想要的。