iT邦幫忙

0

mysql 統計某逗號分隔欄位,值的出現次數

標題有點不清楚

要統計的欄位長得像這樣
新德里,台北,東京
大概有10萬筆資料

目標是依條件統計各個城市的出現次數

現在的寫法是先得出符合條件的欄位的值(SELECT DISTINCT.......)
然後跑迴圈用FINDINSET得出各城市的出現次數

想請問各位先進有沒有更好的寫法
謝謝

fillano iT邦超人 1 級 ‧ 2016-08-06 15:39:17 檢舉
...當初怎麼沒正規化?要不要考慮把它正規化?

2 個回答

0
haoming
iT邦好手 1 級 ‧ 2016-08-06 14:24:08
最佳解答

你是說 資料類似 第一筆 新德里,台北,東京 , 第二筆 台北,東京, 高雄 ....
這樣的資料型態嗎? 如果是我 會 把資料庫 讀書來 然後 愈 explode 拆解資料. 把資料放在 php array 做計算 . 這樣會比用 mysql 做計算快多了..

catding iT邦新手 5 級 ‧ 2016-08-06 16:40:26 檢舉

改成這樣以後,從花費10+秒縮短到不到半秒
謝謝你

haoming iT邦好手 1 級 ‧ 2016-08-08 09:11:51 檢舉

/images/emoticon/emoticon42.gif

0
wybeen
iT邦新手 5 級 ‧ 2016-08-08 09:42:57

找了一下 Stackoverflow

發現一個有趣的解法(雖然我不知道效率如何)

參考原始答案出處

範例

create table `citys` (
  `cityString` varchar(100)
);
insert into citys values('台北,台中'),('台南,高雄,紐約'),('台北,北京'),('上海'),('新德里,台北,東京');
CREATE TABLE `temp` (city varchar(255));
SET @S1 = CONCAT("INSERT INTO temp (city) VALUES ('",REPLACE((SELECT GROUP_CONCAT( DISTINCT  `cityString`) AS data FROM `citys`), ",", "'),('"),"');");
PREPARE stmt1 FROM @s1;
EXECUTE stmt1;
SELECT city, count(*) FROM temp group by city;

SQL Fiddle

http://ithelp.ithome.com.tw/upload/images/20160808/20065840xb7kBazmxn.png

我要發表回答

立即登入回答