2017-02-21 55 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 –