4 Stimmen

Schwierige SQL-Anweisung... Vier Tabellen?

Ich habe eine Datenbank zusammengestellt, die meiner Meinung nach allen "richtigen" Methoden entspricht (Keine redundanten Daten usw.), wie unten gezeigt:

Bildbeschreibung hier eingeben

Ich möchte die Daten anzeigen, die in der Tabelle Nominations gespeichert sind, aber nach einer bestimmten EventID sortiert sind, sowie mit dem Filmtitel Title und dem Jahr, und dem Namen der Auszeichnung. Ich kenne grundlegende Joins, aber das erscheint mir ziemlich kompliziert - weil ich ein Anfänger bin. Jede Hilfe, wie man dieses Problem auf die richtige Weise angeht, damit ich in Zukunft kompliziertere Probleme lösen kann, wird sehr geschätzt!

2voto

Gary Chambers Punkte 23404

Dies ist definitiv der richtige Weg, um diese Datenstruktur aufzubauen, da es Ihnen ermöglichen wird, Ihre Daten recht präzise zu aggregieren. Tatsächlich ist die Abfrage, nach der Sie suchen, eine einfache Serie von Joins:

SELECT
  n.*,
  f.Jahr,
  f.Titel,
  a.Name
FROM `nominations` n
INNER JOIN `events` e ON n.EventID = e.EventID
INNER JOIN `films` f ON n.FilmID = f.FilmID
INNER JOIN `awards` a ON n.AwardID = a.AwardID
WHERE n.EventID = ?

Tatsächlich müssen Sie nicht einmal auf die Events-Tabelle joinen, es sei denn, Sie möchten Daten aus der Ceremonies-Tabelle abfragen.

2voto

DRapp Punkte 45486

Arbeiten Sie zuerst mit dem direkten Qualifikator Ihrer Abfrage und bauen Sie dann darauf auf... Wenn Sie einen bestimmten "Event-ID" Typ möchten, gehen Sie dorthin. Da die Ereignisse und Zeremonien eher "Lookup"-Tabellen sind, möchten Sie wahrscheinlich alle qualifizierenden Nominierungen, also werde ich tatsächlich damit beginnen.

Wählen Sie
      JustNominierten.*,
      f.Titel,
      f.Jahr as Filmjahr,
      a.Name as Auszeichnungsname
   aus
      ( select 
              n.*,
              e.Name as Ereignisname,
              c.Jahr as Zeremoniejahr
           from
              Nominierungen n
                 inner join Ereignisse e
                    on n.EventID = e.EventID
                    inner join Zeremonien c
                       on e.CeremonyID = c.CeremonyID
           where
              e.EventID = WhatEventID ) JustNominierten
      inner join Filme f
         on JustNominierten.FilmID = f.FilmID
      inner join Auszeichnungen a
         on JustNominierten.AwardID = a.AwardID

2voto

Mophilly Punkte 143

Studiere "Joins". Diese sind ein wesentlicher Bestandteil der Verwendung von SQL. Wenn Sie eine SELECT-Anweisung haben, die funktioniert, studieren Sie "Views" und erstellen Sie eine neue Ansicht unter Verwendung Ihrer SELECT-Anweisung.

Um Ihnen den Einstieg zu erleichtern, hier ein unbehandeltes und aus dem Kopf erstelltes Beispiel einer SELECT-Anweisung unter Verwendung von Joins. Bitte beachten Sie auch, dass MySQL kein Werkzeug ist, das ich häufig verwende, daher ist die Syntax wahrscheinlich nicht korrekt für MySQL.

SELECT A.Title, A.Year, C.Name, D.EventID
FROM FILMS A
JOIN NOMINATIONS B ON B.FilmID = A.FilmID
JOIN AWARDS C ON C.AwardID = B.AwardID
JOIN EVENTS D ON D.EventID = B.EventID
WHERE EVENTS.EventID = XX

Dies funktioniert, wenn alle Beziehungen existieren. Studiere "Outer Join", um alle Zeilen einer bestimmten Tabelle, z.B. FILMS, abzurufen und passende Zeilen in den anderen Tabellen einzubeziehen.

Ein Autor namens Joe Celko hat mehrere Bücher über komplexe SQL-Anweisungen geschrieben. Sie könnten seine Arbeit nützlich finden.

mit freundlichen Grüßen

1voto

The Nail Punkte 7932

Es handelt sich tatsächlich um einen einfachen Join, also solltest du dies bereits wissen :-)

Wähle zuerst die richtigen Nominierungen aus und verbinde sie dann mit dem Rest:

SELECT nominations.nominationid,
       films.title,
       films.year,
       awards.name
FROM nominations
JOIN films
ON films.filmid = nominations.filmid
JOIN awards
ON awards.awardid = nominations.awardid
WHERE nominations.eventid = :event_id

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X