2017-02-21 12 views
-2

1つの製品タイプと複数のモデルのみを生産するメーカーを入手してください。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) 

ショートデータベース記述 "コンピュータ会社": 製品:

データベーススキームは4つのテーブルで構成されてい(メーカー、型式、タイプ) PC(コード、モデル、スピード、ラム、HD、CD、価格) ノートパソコン(コード、モデル、スピード、ラム、HD、画面、価格) テーブルには、メーカー、モデル番号、製品の種類( 'PC'、 'Laptop'、または 'Printer')のデータが含まれています。製品テーブルのモデル番号は、すべてのメーカーおよび製品タイプで一意であると想定されています。 PCテーブル内の各パーソナルコンピュータは一意のコードで明確に識別され、そのモデル(製品テーブルを参照する外部キー)、プロセッサ速度(MHz) - 速度フィールド、RAM容量(Mb) - RAM 、ハードディスクドライブ容量(Gb) - hd、CD-ROM速度(例えば、 '4x') - cd、およびその価格。ラップトップの表は、CD-ROMの速度の代わりに、画面のサイズ(インチ) - 画面が含まれている点を除いて、PCの表と似ています。 Printerテーブルの各プリンタモデルについて、カラーフィールド、印刷テクノロジ( 'Laser'、 'Jet'、または 'Matrix') - タイプ、および価格の出力タイプ( 'y'色と 'n' for monochrome)指定されています。

+1

あなたの宿題で幸運を祈る!あなたがそれに成功した場合、戻って教えてください! –

+0

"正しい"答えも間違っていると面白いです... "SELECT DISTINCTメーカー、タイプ...... GROUP BYメーカー...."タイプはGROUP BYに名前がありません - > https:// www .psce.com/blog/2012/05/15/mysql-mistakes-do-you-use-group-by-正しく/ –

答えて

0

(1)「正しい」回答としてマークしたものは、与えられた問題文と矛盾することに注意してください。与えられた問題の声明は、「メーカーとタイプを入手する」ではなく、「メーカーを入手する」と述べている。したがって、「間違った」回答は、問題文が求めていることを正確に行うので、「間違った」とみなすべきではありません。

(2)しかしながら実際の問題文を表現するのが正確ではなく、実際の問題は確かに「実際には1つのタイプしか作っていないメーカーであり、それがタイプである」と仮定すると、 2番目の方法でクエリを書く必要があります。

理由は、GROUP BY句が内部的に「中間テーブル」を作成し、SELECT句がFROM句で指定されたテーブルの代わりにこの「中間テーブル」を実際に参照し、この句に含まれる唯一の列中間テーブルはGROUP BY句で言及されているものです(そして、TYPEは、あなたのケースでは、メーカーごとに異なるタイプの数を数えなければならないという明白な理由ではありません)。

まず、関連メーカーのセットを取得し、元のテーブルに「接続する」必要があります。前者はサブクエリの機能、後者は「WHERE ... IN ...」の機能です。

+0

ありがとうございます。 @Erwin –