1

次の MySQL テーブル構造があるとします。

CREATE TABLE `order_params`( `order_id` BIGINT(30) NOT NULL, 
              `key` VARCHAR(50) NOT NULL, `value` VARCHAR(255) NOT NULL ); 

そして、このデータ:

INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('1', 'browser', 'Firefox'); 
INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('1', 'os', 'Windows'); 
INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('2', 'browser', 'Firefox'); 
INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('2', 'os', 'Windows'); 
INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('3', 'browser', 'Firefox'); 
INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('3', 'os', 'OSX'); 
INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('4', 'browser', 'Safari'); 
INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('4', 'os', 'OSX'); 
INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('5', 'browser', 'Safari'); 
INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('5', 'os', 'OSX'); 
INSERT INTO `order_params` (`order_id`, `key`, `value`) VALUES ('5', 'version', '5'); 

次の結果を得るにはどうすればよいですか?

browser Firefox os Windows              2
browser Firefox os OSX                  1
browser Safari os OSX                   1
browser Safari os OSX version 5         1

右側の数字は、一意のキーと値の組み合わせに一致するレコードの数です。これは可能ですか?

OK、これを試したことを示すために更新します:

SELECT CONCAT(`key`, `value`), COUNT(*)
FROM order_params 
GROUP BY `order_id`, `key`, `value`;

そして、これは結果です:

browserFirefox  1
osWindows       1
browserFirefox  1
osWindows       1
browserFirefox  1
osOS X          1
browserSafari   1
osOS X          1

私もこれを試しました:

SELECT `key`, `value`, COUNT(*)
FROM order_params 
GROUP BY `key`, `value`;

これが生成されます:

browser Firefox  3
browser Safari   1
os OS X          2
os Windows       2

明らかに、これらはどちらも望ましい結果ではありません。

4

1 に答える 1

3

1 つのアプローチは 2 段階の集計です

select browser, os, version, count(*)
from (select order_id,
             max(case when `key` = 'browser' then `value` end) as browser,
             max(case when `key` = 'os' then `value` end) as os,
             max(case when `key` = 'version' then `value` end) as version
      from order_params op
      group by order_id
     ) p
group by browser, os, version

持っている文字列が実際に必要な場合は、それらを連結できます。

select concat(coalesce(concat('browser ', browser), ''),
              coalesce(concat('os ', os), ''),
              coalesce(concat('version ', version), ''), count(*)
from (select order_id,
             max(case when `key` = 'browser' then `value` end) as browser,
             max(case when `key` = 'os' then `value` end) as os,
             max(case when `key` = 'version' then `value` end) as version
      from order_params op
      group by order_id
     ) p
group by os, browser, version
于 2013-03-29T21:28:11.320 に答える