计算以逗号分隔的多个行值

时间:2017-11-21 14:04:07

标签: php mysql arrays

我有一个包含多行的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

我搜索了整个互联网后,我仍然不知道该怎么做。 请善待并给我一些解决它的想法。

5 个答案:

答案 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

Click here for the DEMO

希望它有所帮助!

答案 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

这就是您想要的。