Ankündigung

Einklappen
Keine Ankündigung bisher.

0..n Beziehungen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 0..n Beziehungen

    Hallo,

    sagt mal wenn ich eine Tabelle `Movies` habe und eine Tabelle `Actors` und eine `ConMoviesActors` (Verknüpfungstabelle) und nun für n Filme (also z.B. Filme für eine Seite) so effizient wie möglich auch deren Schauspieler ermitteln möchte, wie gehe ich da vor?
    Ich würde zuerst die n Filme ermitteln (und damit deren ID)

    Code:
    SELECT * FROM movies ORDER BY id ASC LIMIT 0, 30
    (* benutze ich nur der Einfachheit halber)
    und mir dann per PHP die Film-IDs als SQL-WHERE Bedingung schreiben, also

    Code:
    ..WHERE id = 1 OR id = 2 OR id = 3 ....
    Ich halte das für ineffizient. Gibts keine elegantere Lösung? (id >= 1 AND id <= 30 kann ich natürlich nicht verwenden, da ja z.B. auch nach dem Filmtitel sortierte Seitenaufrufe erfolgen könnn, welche durch > < ja nicht zu erfassen sind)

    LEFT JOIN finde ich auch nicht gerade optimal, da ich ja dann ein Ergebnis der Art
    Code:
    1;Pretty Woman;Gere;Richard
    1;Pretty Woman;Roberts;Julia
    2;Top Gun;Cruise;Tom
    3;Ocean's Eleven;Roberts Julia
    3;Ocean's Eleven;Pit;Brett
    3;Ocean's Eleven;was weiß ich wer hier noch mitgespielt hat
    rausbekomme...

    Was ist hier also die Profi- oder Standard-Lösung?
    Danke & Gruß, c

  • #2
    Naja es gibt eine kleine Verbesserung in der Where klausel
    Code:
    ... WHERE id IN (1, 4, 45.....32, 7);
    Des Weiteren gibts die Idee des Subselects.
    Code:
    ..WHERE id IN (SELECT id FROM actors);
    Bin mir bei MySQL nicht sicher aber ich glaube das sollte tun

    Code:
    SELECT DISTINCT(movie.name,actors.name) FROM
      [der JOIN hier sieht je dan deiner Struktur unterschiedlich aus]
      WHERE actor[oder movie].id IN (SELECT id FROM actors[oder movie])
      ORDER BY movie.id, actors.id [oder umgekehrt, je nach Wunsch];
    Gruß
    Der Desian
    Wenn dich was ankotzt, machs besser.

    Kommentar


    • #3
      Re: 0..n Beziehungen

      Zitat von Zergling
      LEFT JOIN finde ich auch nicht gerade optimal, da ich ja dann ein Ergebnis der Art
      Code:
      1;Pretty Woman;Gere;Richard
      1;Pretty Woman;Roberts;Julia
      2;Top Gun;Cruise;Tom
      3;Ocean's Eleven;Roberts Julia
      3;Ocean's Eleven;Pit;Brett
      3;Ocean's Eleven;was weiß ich wer hier noch mitgespielt hat
      rausbekomme...
      Das liegt nur daran, dass Du die Felder auch selektierst.
      Nehmen wir zum Beispiel die Suche "Welche Schauspieler spielen im Film XYZ mit?" Dann brauchst Du nur das Feld mit dem Namen des jeweiligen Schauspielers, nicht nochmal den Filmnamen. Und schon garnicht SELECT *
      Code:
      SELECT
      	a.actor_name
      FROM
      	Movies as m
      JOIN
      	ConMoviesActors as c
      ON
      	c.movie_id=m.movie_id
      JOIN
      	Actors as a
      ON
      	c.actor_id=a.actor_id
      WHERE
      	m.movie_name='xyz'
      ORDER BY
      	a.actor_name ASC

      Kommentar


      • #4
        Danke an beide, ihr habt mir 2 gute neue Ansatzpunkte geliefert, sowas hatte ich mir erhofft. JOIN (ohne INNER oder LEFT) kannte ich z.B. noch garnicht.

        Kommentar

        Lädt...
        X