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

Mysql SQL计数键值列的唯一组合中的行数,mysql,sql,count,group-by,pivot,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');

给定以下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`;
SELECT `key`, `value`, COUNT(*)
FROM order_params 
GROUP BY `key`, `value`;
这就是结果:

browserFirefox  1
osWindows       1
browserFirefox  1
osWindows       1
browserFirefox  1
osOS X          1
browserSafari   1
osOS X          1
我也试过:

SELECT CONCAT(`key`, `value`), COUNT(*)
FROM order_params 
GROUP BY `order_id`, `key`, `value`;
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

请带着怀疑来试试。这个问题没有显示任何研究成果。做家庭作业很重要。告诉我们你发现了什么,为什么它不能满足你的需要。这表明你花了时间来帮助自己,这使我们不必重复显而易见的答案,而且最重要的是,这有助于你得到更具体、更相关的答案。谢谢你。因此,只有提前知道密钥并将其编码到SQL语句中,我才能这样做?我希望能为N个键做这个,你要找的是一个“pivot”操作符,mysql没有。如果你在网站上搜索“mysql pivot”,你会发现很多解决方法。谢谢。这看起来不像我想象的那么有趣。我将对这个表的数据模型进行展平,并在每次运行查询时使用固定列,而不是处理数据透视。