Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Join: Zwei Felder in einer Tabelle

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Tobi81, 12 August 2015.

  1. Tobi81

    Tobi81 Neuer Benutzer

    Hallo zusammen,

    ich möchte gerne Fußballspiele in eine MySQL Datenbank schreiben.
    Dazu habe ich aktuell eine DB in der ich die gespielten Spiele schreibe "spiel" (natürlich hier vereinfacht) und eine Tabelle für die verschiedenen Liegen "liga" und eine Tabelle für die Vereine "verein".

    Nun würde ich gerne ein Select auf die Tabelle Spiel machen, und die entsprechenden Werte aus den anderen Tabellen sehen.

    Hier der Aufbau meiner Tabellen:

    Code:
    CREATE TABLE IF NOT EXISTS `spiel` (
      `id` int(6) NOT NULL,
      `id_verein_heim` int(6) NOT NULL,
      `id_verein_gast` int(6) NOT NULL,
      `id_liga` int(6) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    ALTER TABLE `spiel`
      ADD PRIMARY KEY (`id`);
    ALTER TABLE `spiel`
      MODIFY `id` int(6) NOT NULL AUTO_INCREMENT;
    
    INSERT INTO `spiel` (`id`, `id_verein_heim`, `id_verein_gast`, `id_liga`) VALUES (1, 1, 2, 1);
    Code:
    CREATE TABLE IF NOT EXISTS `liga` (
      `id` int(4) NOT NULL,
      `name` varchar(200) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    ALTER TABLE `liga`
      ADD PRIMARY KEY (`id`);
    ALTER TABLE `liga`
      MODIFY `id` int(4) NOT NULL AUTO_INCREMENT;
    
    INSERT INTO `liga` (`id`, `name`) VALUES (1, '1. Bundesliga');
    Code:
    CREATE TABLE IF NOT EXISTS `verein` (
      `id` int(11) NOT NULL,
      `name` varchar(200) NOT NULL,
      `kurzname` varchar(10) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    ALTER TABLE `verein`
      ADD PRIMARY KEY (`id`);
    ALTER TABLE `verein`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
    
    INSERT INTO `verein` (`id`, `name`, `kurzname`) VALUES
    (1, 'Fußballverein 1', 'FBV 1'),
    (2, 'Fußballverein 2', 'FBV 2');

    So sieht mein SQL Statement aktuell aus, aber ich bekomm es nur mit einem Vereinsnamen hin:

    Code:
    SELECT v.name, l.name FROM spiel s, verein v, liga l WHERE s.id_verein_heim=v.id AND s.id_liga=l.id
    Knackpunkt ist wohl: s.id_verein_heim=v.id


    Wie bekomme ich das jetzt mit den beiden Vereine angezeigt?



    Vielen Dank,
    Tobi
     
  2. ukulele

    ukulele Datenbank-Guru

    Ohne mir jetzt alles angeguckt zu haben etwa so:
    Code:
    SELECT    vh.name,
            vg.name,
            l.name
    FROM    spiel s
    LEFT JOIN verein vh
    ON        s.id_verein_heim = vh.id
    LEFT JOIN verein vg
    ON        s.id_verein_gast = vg.id
    LEFT JOIN liga l
    ON        s.id_liga=l.id
    Du hast ja im prinzip schon einen INNER JOIN verwendet, ich würde den Join aber a) explizit als solchen ausschreiben und b) einen LEFT JOIN nehmen. Außerdem musst du die Vereinstabelle zweimal joinen mit unterschiedlichen Aliasen.
     
    Tobi81 gefällt das.
  3. Tobi81

    Tobi81 Neuer Benutzer

    Vielen Dank ukulele, dass funktioniert! :)

    Die Syntax ist schon hart für mich. Da muss ich mal ein bisschen drüber nachdenken, um das zu verstehen... :-/

    Würdest du die IDs der beiden Vereine auch in der Übersichtstabelle speichern, oder eher eine zweite Tabelle bauen, in der zu der Begegnung passend die IDs der Vereine stehen?


    Dank Dir!
     
  4. ukulele

    ukulele Datenbank-Guru

    Also wenn du mit "Überischtstabelle" die Tabelle "spiel" meinst dann sollten die IDs beider Vereine da drinne stehen. Es handelt sich eigentlich um eine n:m Beziehung von der "verein"-Tabelle mit sich selbst die bekanntlich als eigene Tabelle abgebildet wird und es sind ja immer genau 2 Vereine, keine der Spalten darf NULL sein.

    Streng genommen bilden diese beiden Foreign Keys zusammen mit Datum/Uhrzeit des Spiels auch einen eindeutigen Schlüssel, könnten also als Primary Key dienen. Aus Komfortgründen arbeite ich aber nicht gerne mit zusammengesetzten PKs.
     
    Tobi81 gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden