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

标签 mysql sql count group-by pivot

给定以下 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

右边的数字是匹配唯一键/值组合的记录数。这可能吗?

好的,更新以表明我已经尝试过:

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

显然,这两个都不是想要的结果。

最佳答案

一种方法是聚合的两个阶段

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

关于mysql - SQL 计算键值列的唯一组合中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15711621/

相关文章:

mysql - 如何有选择地从 mysqldump 中导入几个表

Mysql:使用正则表达式匹配作为字段?

java - 这个sql查询有什么问题导致这个错误?

sql - 如何在 SQL Server 中设计查询或查找错误?

php - SQL语法错误,PHP MYSQL

mysql - 优化多行计数

MySql:如果在函数内部或外部调用,相同的 select count(*) 查询将返回不同的结果

c++ - 调用 mysql_close 导致堆栈损坏,这是 MySQL 中的错误吗?

mysql - 在不点击每个条目的情况下更新事物列表

python - 从现有词典创建频率词典