2012-04-11 3 views
3

Ich lösen www.db-class.com Übungen. Obwohl es spät ist, sind die Fragen immer noch interessant. Ich stolperte über letzte Aufgabe in Extras und kann die Lösung nicht herausfinden.SQL-Abfrage von www.db-class.com

Die SQL-Schema ist wie folgt:

create table Movie(mID int, title text, year int, director text); 
create table Reviewer(rID int, name text); 
create table Rating(rID int, mID int, stars int, ratingDate date); 

Die gesamte Datenbank kann here

Die Frage ist die folgende obtainted werden:

Q12 Für jeden Regisseur, kehren Sie den Namen des Regisseurs zusammen mit den Titel (n) der Filme, die sie gerichtet, die die höchste Bewertung unter allen ihren Filmen erhalten haben, und die val von dieser Bewertung. Ignoriere Filme, deren Director NULL ist.

spezifischere Details zu geben, was hier das Problem:

Eine Abfrage

select m.mid, m.title, max(r.stars) as stars 
from rating r natural join movie m 
where m.director is NOT NULL group by m.mid 

kehrt IDs von den meisten bewerteten Filme:

101 Gone with the Wind  4 
103 The Sound of Music  3 
104 E.T.      3 
107 Avatar     5 
108 Raiders of the Lost Ark 4 

Eine weitere Abfrage

select m.director, max(r.stars) as stars 
from rating r natural join movie m 
where m.director is NOT NULL group by m.director 

kehrt Namen der Direktoren mit den meisten bewerteten Filme für sie:

James Cameron  5 
Robert Wise   3 
Steven Spielberg 4 
Victor Fleming  4 

Wie die Abfragen verbinden und den Namen und die Sterne für die meisten bewertet Film für den Regisseur erhalten:

James Cameron  Avatar     5 
Robert Wise  The Sound of Music  3 
Steven Spielberg Raiders of the Lost Ark 4 
Victor Fleming  Gone with the Wind  4 

Antwort

2

meiner Meinung nach ist dies nur ein gretest-n-per-Gruppe Problem. Es gibt sogar eine tag dafür

Der einzige Unterschied mit der typischen Situation ist, dass die Gruppierungsdaten (Direktor) in einer Tabelle ist und die Daten für den Vergleich in einer anderen Tabelle (Sterne) verwendet werden. Wenn Sie also die als solche gekennzeichnete Frage betrachten, sollten Sie ähnliche Beispiele finden.

Ich würde Ihnen empfehlen, es zuerst zu lösen, vorausgesetzt, dass alle Ihre Daten in einer Tabelle sind (schrecklich, aber leichter zu lösen ... zumindest für mich). Und dann wechseln Sie zu den geteilten Daten.

Spoiler:

Ich denke, das ist, wie dies so zu lösen, nur um einen Blick nehmen, wenn Sie bereits eine Lösung vorgeschlagen haben.

select distinct m1.director, m1.title, r1.stars from movie m1 
join rating r1 on m1.mID = r1.mID 
left join (
    select m2.director, r2.stars from movie m2 
    join rating r2 on m2.mID = r2.mID 
) s on m1.director = s.director and r1.stars < s.stars 
where s.stars is null and m1.director is not null 
+0

Die Lösung gibt NULL-Directors zurück und erhält keine Titel. Die Aufgabe ist einfach ohne Titel oder ohne Regisseure, aber wenn beide benötigt werden, ist es viel schwieriger –

+0

Nicht wirklich :) Ich habe den Filmtitel hinzugefügt und Null-Regisseure entfernt (Ich bin mir nicht sicher, wenn 'Filme ignorieren, deren Regisseur ist NULL' bedeutet um sie aus dem Ergebnis zu entfernen, also nur für den Fall, habe ich) –

+0

Ich fand eine ähnliche Lösung, aber es gibt mehr als einen Regisseur für alle Filme. Die Antworten erfordern eindeutig einen Regisseur pro Film pro max (Sterne) –

0

Vorschlag:

  1. eine einfache Abfrage erstellen, die alle Direktoren Listen (leicht)

  2. ein „join“ tun, die jeden Film verbindet - zusammen mit seinem Regisseur - auf die entsprechende Bewertung

  3. die „Join“ von Schritt 2 Nehmen Sie und machen Sie eine „Gruppe von“ -Regisseur und „max (Stern)“

+0

Ich habe es getan. Es gibt mehr als einen Regisseur für alle Filme. Die Antworten verlangen eindeutig einen Regisseur pro Film pro Maximum (Sterne). –