Tobi: MySQL-Join

Hallo,

irgendwie steh ich grad aufm Schlauch.

Ich habe 2 Tabellen.

Die erste enthält eine ID, die jeweils nur einmal vorkommt.
die zweite enthält mehrere einträge mit der ID aus der 1. tabelle.

ich möchte jetzt die beiden miteinander verknüpfen, aber dabei nur 1 ergebnis für jede ID erhalten.
Es soll jede ID aus der 1. Tabelle mit dem aktuellsten Eintrag der 2. Tabelle verknüpft werden.

Mit GROUP BY bekomme ich jeweils nur einen eintrag, allerdings stimmt dann die verknüfung nicht, weil die einträge aus der 2. tabelle nicht sortiert werden (ORDER BY)?

Gibt es da einen passenden JOIN-Befehl?

Vielen Dank!

  1. Hallo Freunde des gehobenen Forumsgenusses,

    Die erste enthält eine ID, die jeweils nur einmal vorkommt.
    die zweite enthält mehrere einträge mit der ID aus der 1. tabelle.

    ich möchte jetzt die beiden miteinander verknüpfen, aber dabei nur 1 ergebnis für jede ID erhalten.
    Es soll jede ID aus der 1. Tabelle mit dem aktuellsten Eintrag der 2. Tabelle verknüpft werden.

    select tabelle1.spalte, tabelle2.spalte from tabelle1 inner join tabelle2 on tabelle1.id = tabelle2.id

    War es das, was du gesucht hast? Die Eingrenzung der Ergebnismenge mit on?

    Gruß
    Alexander Brock

    1. Hallo,

      nein, nicht ganz.
      Die Verknüfung hatte ich soweit auch schon.

      select tabelle1.spalte, tabelle2.spalte from tabelle1 inner join tabelle2 on tabelle1.id = tabelle2.id

      hiermit bekomme ich mehrere Ergebnisse, wenn es in tabelle2 mehrere Einträge mit der gleichen id gibt.

      Als Ergebnis möchte ich aber nur einen Eintrag.

      Gruß Tobi

      1. Hallo Freunde des gehobenen Forumsgenusses,

        select tabelle1.spalte, tabelle2.spalte from tabelle1 inner join tabelle2 on tabelle1.id = tabelle2.id

        hiermit bekomme ich mehrere Ergebnisse, wenn es in tabelle2 mehrere Einträge mit der gleichen id gibt.

        Als Ergebnis möchte ich aber nur einen Eintrag.

        Woran kannst du diesen Eintrag identifizieren?
        Oder ist es egal, welcher das ist -> limit 1

        Gruß
        Alexander Brock

        1. Hallo!

          Woran kannst du diesen Eintrag identifizieren?
          Oder ist es egal, welcher das ist -> limit 1

          Nein, limit 1 funktioniert nicht, da ich ja in tabelle1 mehrere Einträge habe.

          in tabelle2 gibt es tabelle2.datum, hiernach möchte ich gerne sortieren ORDER BY tabelle2.datum DESC und nur den neuesten Eintrag verknüfen.

          Wenn ich GROUP BY tabelle1.id verwende, bekomme ich zwar jeweils nur 1 Ergebnis, aber tabelle2 wird nicht nach tabelle2.datum sortiert, sondern beliebig verknüpft.

          Gruß und Danke für die Antworten!

          1. Hallo Freunde des gehobenen Forumsgenusses,

            Nein, limit 1 funktioniert nicht, da ich ja in tabelle1 mehrere Einträge habe.

            Könntest du mal einen (Beispiel-)MySQL-Dump der beiden Tabellen zur Verfügung stellen? Ich hab da eine Idee, würde das aber gerne zuerst mal ausprobieren.

            Gruß
            Alexander Brock

            1. Hallo,

              Könntest du mal einen (Beispiel-)MySQL-Dump der beiden Tabellen zur Verfügung stellen? Ich hab da eine Idee, würde das aber gerne zuerst mal ausprobieren.

              --
              -- Tabellenstruktur für Tabelle tabelle1
              --
              CREATE TABLE IF NOT EXISTS tabelle1 (
                id int(10) unsigned NOT NULL auto_increment,
                bezeichnung varchar(200) NOT NULL,
                PRIMARY KEY  (id)
              ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tabelle 1' AUTO_INCREMENT=4 ;
              --
              -- Daten für Tabelle tabelle1
              --
              INSERT INTO tabelle1 (id, bezeichnung) VALUES (1, 'Eintrag 1'),
              (2, 'Eintrag 3'),
              (3, 'Eintrag 4');
              -- --------------------------------------------------------
              --
              -- Tabellenstruktur für Tabelle tabelle2
              --
              CREATE TABLE IF NOT EXISTS tabelle2 (
                id int(10) unsigned NOT NULL auto_increment,
                tabelle1\_id int(10) unsigned NOT NULL,
                bezeichnung varchar(200) NOT NULL,
                PRIMARY KEY  (id)
              ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='tabelle2' AUTO_INCREMENT=7 ;
              --
              -- Daten für Tabelle tabelle2
              --
              INSERT INTO tabelle2 (id, tabelle1\_id, bezeichnung) VALUES (1, 1, 'Eintrag nummer 1 in tabelle 2 mit tabelle1_id = 1'),
              (2, 0, 'Eintrag nummer 2 in tabelle 2 mit tabelle1_id = 1'),
              (3, 1, 'Eintrag nummer 3 in tabelle 2 mit tabelle1_id = 1'),
              (4, 2, 'Eintrag nummer 1 in tabelle 2 mit tabelle1_id = 2'),
              (5, 2, 'Eintrag nummer 2 in tabelle 2 mit tabelle1_id = 2'),
              (6, 3, 'Eintrag nummer 1 in tabelle 2 mit tabelle1_id = 3');
              passt das so?
              MySQL-Version: 4.0.15
              Danke für die Hilfe!
              Grüße Tobi
          2. yo,

            ab mysql version 4.1 kannst du es mit korellierenden unterabfragen lösen.

            select t1.spalte, t2.spalte
            from tabelle1 AS t1
            inner join tabelle2 AS t2
            on t1.id = t2.id
            WHERE t2.datum =
              (
              SELECT MAX(t3.datum) FROM tabelle2 AS t3 WHERE t3.id = t2.id
              )

            beim inner join ist noch zu beachten, dass es immer einen passenden datensatz (id) in beiden tabellen befinden muss.

            Ilja

            1. hallo,

              ab mysql version 4.1 kannst du es mit korellierenden unterabfragen lösen.

              geht leider nicht :( ist version 4.0.15...
              trotzdem danke
              tobi

              1. yo,

                dann kannst du zumindestenz die spalten der tabelle1 ausgeben und das datum von tabelle2.

                select t1.*, MAX(t2.datum)
                from tabelle1 AS t1
                inner join tabelle2 AS t2
                on t1.id = t2.id
                GROUP BY t1.*

                Ilja

                1. Hallo,

                  dann kannst du zumindestenz die spalten der tabelle1 ausgeben und das datum von tabelle2.

                  select t1.*, MAX(t2.datum)
                  from tabelle1 AS t1
                  inner join tabelle2 AS t2
                  on t1.id = t2.id
                  GROUP BY t1.*

                  mmh, das Problem dabei ist, dass in tabelle2 noch mehr werte stehen die je nach datum auch unterschiedlich sind...
                  vielleicht fällt mir noch was ein...
                  trotzdem danke.
                  gruß Tobi

                  1. yo,

                    mmh, das Problem dabei ist, dass in tabelle2 noch mehr werte stehen die je nach datum auch unterschiedlich sind...
                    vielleicht fällt mir noch was ein...

                    das wird ohne unterabfragen sehr schwer werden. du musst auch bedenken, dass rein theoretisch maximale datumswerte auch gleich sein könnten. in prinzip sind es zwei schritte, die man tun muss:

                    1. bestimme den höchsten datumswert der jeweiligen id.
                    2. gebe mir den datenstz der tabelle zwei aus, welchen diesem maximalen datumswert entspricht (kann mehr als einer sein) und zusäztlich die informationen aus tabelle zwei.

                    damit wird auch schon deutlich, dass es quasi zwei abfragen sind. und ohne unterabfragen sehe ich auf den ersten blick keine möglichkeit.

                    Ilja