我正在使用两个表model
和variation
来处理某些设备系列的特殊版本,这些版本具有一些略有不同的属性,例如移动系列是黑色的,但是它的颜色是特殊的版本使用金色作为颜色。我正在尝试查询一些平均数据,如价格,速度,以及找出哪些材料和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_material
和most_used_cpu
获取正确的值吗?
我还想知道是否有必要对每个字段(material
和cpu
)使用子查询来获取最常出现的值。在我的实际情况中,我还有一些我希望得到最多值的字段。有没有办法优化查询?
查询:
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')
;
答案 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列表中只有一个表达式,并确保返回的行不超过一行。
获取最常用材料的查询将类似。