字段包含多个值时的Mysql计数和分组依据

字段包含多个值时的Mysql计数和分组依据,mysql,Mysql,让我们做一些类似的事情: mysql> SELECT field1, field2 FROM mytable; +--------+-------------+ | field1 | field2 | +--------+-------------+ | tom | a,b,c | | jerry | a,c | | mick | b | | steve | a | +--------+------

让我们做一些类似的事情:

mysql> SELECT field1, field2 FROM mytable;
+--------+-------------+
| field1 | field2      |
+--------+-------------+
| tom    | a,b,c       |
| jerry  | a,c         |
| mick   | b           |
| steve  | a           |
+--------+-------------+
我希望得到字段2中单个值的计数,即:

+--------+-------------+
| value  | count       |
+--------+-------------+
| a      | 3           |
| b      | 2           |
| c      | 2           |
+--------+-------------+
Tyr这是:

DELIMITER $$
DROP PROCEDURE IF EXISTS `proc_split`$$
CREATE PROCEDURE `proc_split`(
    inputstring VARCHAR(1000),
    delim CHAR(1)
)
BEGIN
    DECLARE strlen INT;
    DECLARE last_index INT;
    DECLARE cur_index INT;
    DECLARE cur_char VARCHAR(200);
    DECLARE len INT;
    SET cur_index=1;
    SET last_index=0;
    SET strlen=LENGTH(inputstring);  
    DROP TABLE IF EXISTS splittable;
    CREATE TEMPORARY TABLE splittable(
        id INT AUTO_INCREMENT,
        v VARCHAR(20),
        PRIMARY KEY (`ID`),
        UNIQUE KEY `ID` (`ID`)
    ) ;
    WHILE(cur_index<=strlen) DO    
    BEGIN
        IF SUBSTRING(inputstring FROM cur_index FOR 1)=delim OR cur_index=strlen THEN
            SET len=cur_index-last_index-1;
            IF cur_index=strlen THEN
               SET len=len+1;
            END IF;
            INSERT INTO splittable(`v`) VALUES (SUBSTRING(inputstring FROM   (last_index+1) FOR len));
            SET last_index=cur_index;
        END IF;
        SET cur_index=cur_index+1;
    END;
    END WHILE;
END$$
DELIMITER ;
group\u concat有一个字符串限制,如果您的表中有太多记录,您应该在mysql配置中将此值配置为“多对多”,然后首先重新设计您的模式。这可能很有用:
CALL proc_split((select group_concat(field2) from mytable),',');

SELECT *,count(1) as count FROM splittable group by v;