2017-02-21 54 views
-2

获得只生产一种产品类型和多种型号的制造商。MYSQL中的HAVING和GROUP BY有什么问题?

错误答案

`SELECT` `DISTINCT` maker 
from Product `GROUP BY` maker 
`HAVING` (`COUNT`(`DISTINCT` TYPE) = 1 `AND` `COUNT`(`DISTINCT` model) > 1) 

正确答案

`SELECT` `DISTINCT` maker, type 
`from` Product 
`WHERE` maker in (SELECT DISTINCT maker from Product 
`GROUP BY` maker `HAVING` `COUNT`(`DISTINCT` TYPE) = 1 `AND` `COUNT`(model) > 1) 

简短数据库描述 “计算机公司”:

数据库方案由四个表: 产品(制造商,型号,型号) PC(代码,型号,速度,RAM,HD,CD,价格) 笔记本电脑(代码,型号,速度,RAM,HD,屏幕,价格) 打印机(代码,型号,颜色,型号,价格) 产物表包含制造商,型号和产品类型(“PC”,“笔记本”或“打印机”)的数据。假定产品表中的型号对于所有制造商和产品类型都是唯一的。 PC表格中的每台个人计算机都用一个唯一的代码进行唯一标识,并且还通过其型号(外键指产品表),处理器速度(以MHz为单位) - 速度字段,RAM容量(以Mb为单位) ,硬盘驱动器容量(Gb) - 高清,CD-ROM速度(例如'4x') - cd及其价格。笔记本电脑桌与PC桌类似,不同之处在于它不包含CD-ROM速度,而是包含屏幕尺寸(英寸) - 屏幕。对于Printer表中的每个打印机型号,其输出类型('y'表示颜色,'n'表示单色) - 色域,打印技术('Laser','Jet'或'Matrix') - 类型和价格被指定。

+1

祝您的功课!请随时回来告诉我们,如果你成功做到了! –

+0

搞笑的是 “正确” 的答案也是错误的...'SELECT DISTINCT制造商,类型...... GROUP BY壶....'类型不GROUP BY内命名 - >参阅:https:// WWW .psce.com/blog/2012/05/15/mysql-errors-do-you-use-group-by-incorrect/ –

回答

0

(1)请注意,你什么标记为“正确”的答案与问题的陈述矛盾给出。所给出的问题陈述是“让制造商”,而不是“制造商和类型”。因此,“错误的”答案不应该被认为是“错误的”,因为它确实是问题陈述所要求的。 (2)然而,假设你在描述实际问题陈述时并不准确,实际问题确实是“让制造商只生产一种类型,而且它的类型”,它是确实有必要以第二种方式编写查询。

原因是GROUP BY子句在内部创建了一个“中间表”,而SELECT子句实际上引用了这个“中间表”而不是FROM子句中指定的表,并且包含在这个列中的唯一列中间表是GROUP BY子句中提到的中间表(在你的情况下,TYPE不是,因为你必须计算每个制造商不同类型的数量)。

所以,你必须先得到一组有关厂商,然后在“连接会回到”原始表。前者是子查询所做的,后者是“Where ... IN ...”所做的事情。

+0

谢谢你的解释。 @Erwin –