简体   繁体   English

SQL计数键值列的唯一组合中的行数

[英]SQL count number of rows in unique combinations of key value columns

Given the following MySQL table structure: 给定以下MySQL表结构:

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

And this data: 这个数据:

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'); 

How do I get the following results? 我如何获得以下结果?

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

The numbers on the right are the count of records that match the unique key/value combinations. 右侧的数字是与唯一键/值组合匹配的记录数。 Is this even possible? 这甚至可能吗?

OK, updating to show that I have tried this: 好的,更新以显示我已经尝试过:

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

And this is the result: 这就是结果:

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

I've also tried this: 我也试过这个:

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

Which produces this: 产生这个:

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

Obviously, neither of these is the desired result. 显然,这些都不是理想的结果。

One approach is two stages of aggregation 一种方法是两个聚合阶段

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

If you actually want the string that you have, you can concat things together: 如果你真的想要你拥有的字符串,你可以将它们连在一起:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM