2017-02-21 1 views
-2

Holen Sie sich die Hersteller, die nur einen Produkttyp und mehr als ein Modell produzieren.Was ist los mit HAVING und GROUP BY in MySQL?

Falsche Antwort:

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

richtige Antwort:

`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) 

Kurze Beschreibung der Datenbank "Computerfirma":

Das Datenbank-Schema besteht aus vier Tabellen: Produkt (Hersteller, Modell, Typ) PC (code, modell, geschwindigkeit, ram, hd, cd, preis) Laptop (code, modell, geschwindigkeit, ram, hd, bildschirm, preis) Drucker (code, modell, farbe, typ, preis) Das Produkt Die Tabelle enthält Daten zum Hersteller, zur Modellnummer und zum Produkttyp ("PC", "Laptop" oder "Drucker"). Es wird davon ausgegangen, dass die Modellnummern in der Produkttabelle für alle Hersteller und Produkttypen eindeutig sind. Jeder PC in der PC-Tabelle ist eindeutig durch einen eindeutigen Code identifiziert und wird zusätzlich durch sein Modell (Fremdschlüssel bezieht sich auf die Produkttabelle), Prozessorgeschwindigkeit (in MHz) - Geschwindigkeitsfeld, RAM-Kapazität (in MB) - RAM gekennzeichnet , Festplattenkapazität (in Gb) - hd, CD-ROM-Geschwindigkeit (z. B. "4x") - CD und dessen Preis. Der Laptop-Tisch ist dem PC-Tisch ähnlich, außer dass er anstelle der CD-ROM-Geschwindigkeit die Bildschirmgröße (in Zoll) - Bildschirm enthält. Für jedes Druckermodell in der Tabelle "Drucker" wird der Ausgabetyp ("y" für Farbe und "n" für Schwarzweiß) - Farbfeld, Drucktechnologie ("Laser", "Jet" oder "Matrix") - Typ und Preis angegeben sind angegeben.

+1

Viel Glück bei Ihren Hausaufgaben! Bitte zögern Sie nicht und sagen Sie uns, ob Sie es geschafft haben! –

+0

Lustig, dass die "richtige" Antwort auch falsch ist ... 'SELECT DISTINCT Maker, Typ ...... GROUP BY maker ....' Typ ist nicht in der GROUP BY genannt -> lesen https: // www .psce.com/blog/2012/05/15/mysql-errors-do-you-use-group-by-korrekt/ –

Antwort

0

(1) Beachten Sie, dass das, was Sie als "richtige" Antwort markiert haben, im Widerspruch zu der angegebenen Problemstellung steht. Die gestellte Problemaussage lautet "Holt die Macher", nicht "Holt die Macher und den Typ". Die "falsche" Antwort sollte daher nicht als "falsch" betrachtet werden, da sie genau das tut, was die Problemstellung verlangt.

(2) Angenommen jedoch, dass Sie die tatsächliche Problemaussage nicht korrekt wiedergegeben haben, und das tatsächliche Problem war in der Tat "die Macher, die nur einen Typ machen, und der Typ, der es ist", ist es tatsächlich notwendig, um die Abfrage auf die zweite Art zu schreiben. Der Grund ist, dass die GROUP BY-Klausel intern eine "Zwischentabelle" erstellt und die SELECT-Klausel tatsächlich auf diese "Zwischentabelle" statt auf die in der FROM-Klausel angegebene Tabelle und die einzigen Spalten verweist, die in dieser Klausel enthalten sind Zwischentabelle sind diejenigen, die in der GROUP BY-Klausel erwähnt werden (und TYPE ist in Ihrem Fall nicht aus dem offensichtlichen Grund, dass Sie die Anzahl der unterschiedlichen Typen pro Hersteller zählen müssen).

Also müssen Sie zuerst die Reihe der betroffenen Hersteller, und dann "verbinden diese zurück" mit der ursprünglichen Tabelle. Ersteres ist das, was die Unterabfrage tut, letzteres ist es, was das "WHERE ... IN ..." tut.

+0

Vielen Dank für eine Erklärung. @Erwin –