2014-09-30 150 views
-1
數和組

讓我們有這樣的事:MySQL會當一個字段包含多個值

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

谷歌用於配置該值「許多一對多」和首先重新設計您的模式。 – zerkms 2014-09-30 07:39:40

+0

這可能是有用的:http://stackoverflow.com/questions/17308669/reverse-group-concat-in-mysql – Milen 2014-09-30 07:42:07

回答

0

酪氨酸這樣的:

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 ; 

呼叫流程,結果存儲到臨時表中,然後得到你想要的需要

CALL proc_split((select group_concat(field2) from mytable),','); 

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

GROUP_CONCAT有串的限制,如果你在你的餐桌太多記錄,你應該在你的MySQL配置