与count结合以获得mysql中最多的值

时间:2014-11-26 22:04:34

标签: html mysql database

Fiddle Example

我正在使用两个表modelvariation来处理某些设备系列的特殊版本,这些版本具有一些略有不同的属性,例如移动系列是黑色的,但是它的颜色是特殊的版本使用金色作为颜色。我正在尝试查询一些平均数据,如价格,速度,以及找出哪些材料和cpu主要是产品中的特色。

我的预期结果应该是这样的:

AVG_SPEED   AVG_PRICE   MOST_USED_MATERIAL  MOST_USED_CPU
6375        1200        Gold                Intel

但是我提出的查询给了我这个结果:

AVG_SPEED   AVG_PRICE   MOST_USED_MATERIAL  MOST_USED_CPU
6375        1200        Gold                (null)

有人可以告诉我如何为Most_used_materialmost_used_cpu获取正确的值吗?

我还想知道是否有必要对每个字段(materialcpu)使用子查询来获取最常出现的值。在我的实际情况中,我还有一些我希望得到最多值的字段。有没有办法优化查询?

查询:

SELECT AVG(coalesce(v.speed,m.speed)) AS avg_speed,
AVG(m.price) AS avg_price,
 (SELECT v.material 
   FROM version v
   INNER JOIN model m ON v.model_id = m.model_id
   ORDER BY COUNT(coalesce(v.material,m.material)) 
   DESC LIMIT 0,1
 ) AS most_used_material,

 (SELECT v.cpu 
   FROM version v
   INNER JOIN model m ON v.model_id = m.model_id
   ORDER BY COUNT(coalesce(v.cpu,m.cpu)) 
   DESC LIMIT 0,1
 ) AS most_used_cpu

FROM version v 
INNER JOIN model m ON v.model_id = m.model_id

CREATE TABLE version
    (`version_id` int,`model_id` int,`speed` int,`cpu` varchar(10),`material`varchar(30))
;

INSERT INTO version
    (`version_id`,`model_id`,`speed`,`cpu`,`material`)
VALUES
    (1,1,6000,NULL,'Gold'),
    (2,2,NULL,NULL,NULL),
    (3,3,NULL,'AMD',NULL),
    (4,3,7000,NULL,NULL)
;

CREATE TABLE model
    (`model_id` int,`name` varchar(30),`speed` int,`price` int,`cpu` varchar(10),`material` varchar(30))
;

INSERT INTO model
    (`model_id`,`name`,`speed`,`price`,`cpu`,`material`)
VALUES
    (1,'A856',5500,1500,'Intel','Steel'),
    (2,'A820',6000,1300,'Intel','Gold'),
    (3,'X9',6500,1000,'Intel','Plastic')
;

1 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

  ( SELECT COALESCE(v.cpu,m.cpu) AS cpu
      FROM version v
      JOIN model m ON v.model_id = m.model_id
     GROUP BY COALESCE(v.cpu,m.cpu)
     ORDER BY COUNT(1) DESC LIMIT 1
  ) AS most_used_cpu

对于测试,您可以运行单独的SQL语句。这将允许您将COUNT(1)添加到SELECT列表,并且不使用LIMIT子句。要将它作为子查询包含在外部查询的SELECT列表中,您需要它像上面显示的查询一样,在SELECT列表中只有一个表达式,并确保返回的行不超过一行。

获取最常用材料的查询将类似。