Daniel: probleme beim auslesen aus mehreren tabellen

Hallo einmal,

Ich möchte gerne aus mehreren Tabellen Daten auslesen und auf Vorhandenheit überprüfen, laut mysql Homepage sollte das so gehen:

SELECT
best_beantragt.referenz_nr, best_offen.referenz_nr, best_ausgeliefert.referenz_nr
FROM
best_beantragt,best_offen,best_ausgeliefert
WHERE
best_beantragt.referenz_nr = "abcdef"
OR
best_offen.referenz_nr = "abcdef"
OR
best_ausgeliefert.referenz_nr = "abcdef";

...aber irgendwie geht das so nicht, ich bekomme zwar keinen SQL-Error, aber ich bekomme auch nicht das gewünschte Ergebnis, weil es existieren ein paar Datensätze mit "abcdef".

Vielleicht kann mir von euch Self-mysql'ler einen Rat geben? :)
Danke

mfg,
Daniel

  1. Hallo!

    SELECT
    best_beantragt.referenz_nr, best_offen.referenz_nr, best_ausgeliefert.referenz_nr
    FROM
    best_beantragt,best_offen,best_ausgeliefert
    WHERE
    best_beantragt.referenz_nr = "abcdef"
    OR
    best_offen.referenz_nr = "abcdef"
    OR
    best_ausgeliefert.referenz_nr = "abcdef";

    Kein Fehler bedeutet, die Bedingung schlägt nicht an.

    Lase mal die WHERE-Klausel weg und schaue Dir mal das Ergebnis an. Steht da bei best_beantragt.referenz_nr und den anderen wirklich "abcdef"?

    Vielleicht kann mir von euch Self-mysql'ler einen Rat geben? :)

    Neee, so jetzt nicht.

    Ansonsten, akknst Du die DB als MySQL-Dump zum Download bereit stellen?

    MfG, André Laugks

    --
    L-Andre @ gmx.de
    1. Hallo Andre

      Kein Fehler bedeutet, die Bedingung schlägt nicht an.

      Lase mal die WHERE-Klausel weg und schaue Dir mal das Ergebnis an. Steht da bei best_beantragt.referenz_nr und den anderen wirklich "abcdef"?

      Ich hab einmal die WHERE Klausel weggelassen (ich teste das immer mit phpmyadmin) und dort sagt er mir trotzdem, dass der Befehl erfolgreich ausgeführt wurde, aber es wird kein Datensatz zurückgegeben.

      Vielleicht kann mir von euch Self-mysql'ler einen Rat geben? :)

      Neee, so jetzt nicht.

      Wieso denn nicht? ;)

      Ansonsten, akknst Du die DB als MySQL-Dump zum Download bereit stellen?

      Aber selbstverfreilich

      http://www.munds.at/mysql_dump.txt

      Bitte den darin enthaltenen Daten keine allzugrosse Beachtung schenken, ist noch in der Testphase :)

      Danke,
      Daniel

      1. Hallo!

        http://www.munds.at/mysql_dump.txt

        Bitte den darin enthaltenen Daten keine allzugrosse Beachtung schenken, ist noch in der Testphase :)

        Mit so einem Dump kann man sich einen besseren Überblick verschaffen.

        Wieso funktioniert Deine SQL-Abfrage nicht? In den Tabellen "best_offen" und "best_ausgeliefert" steht in den Spalten referenz_nr keine Werte. In der Spalte "referenz_nr" der Tabelle "best_beantragt" gibt es ein paar Datenwerte. Was soll Dir MySQL nun anzeigen? MySQL kann halt Datenwerte mit NICHTS nicht verbinden. Den JOIN den  Du angewendet hast, nennt man EQUI JOIN.

        Für so etwas gibt es den LEFT JOIN oder RIGHT JOIN. MySQL zeigt hier auch Zeilen aus der linken Tabelle an, für die es in der rechten Tabelle keine Übereinstimmung gibt. Für Datenwerte, für die es in der rechten Tabelle keine Übereinstimmung gibt, wird NULL angezeigt. Bei einem RIGHT JOIN ist das genau umgekehrt. In einem MySQL-Buch wird Dir das sicherlich mit Beispielen besser erklärt, als ich das hier kann.

        // LEFT JOIN
        Links --> Rechts
        best_beantragt --> best_offen --> best_ausgeliefert

        FROM best_beantragt AS a LEFT JOIN best_offen AS b ON (a.interne_id>0 OR b.interne_id>0) LEFT JOIN best_ausgeliefert AS c ON (c.interne_id>0)

        Man schaut auf die Tabellen dem SQL-Statment nach entlang von links nach rechts.

        SELECT
            a.referenz_nr AS ref_nr_1,
            b.referenz_nr As ref_nr_2,
            c.referenz_nr As ref_nr_3
        FROM
            best_beantragt AS a LEFT JOIN best_offen AS b ON (a.interne_id>0 OR b.interne_id>0)
            LEFT JOIN best_ausgeliefert AS c ON (c.interne_id>0)
        WHERE
            a.referenz_nr = "abcdef
            OR
            b.referenz_nr = "abcdef"
            OR
            c.referenz_nr = "abcdef";

        In den Klammern "(a.interne_id>0 OR b.interne_id>0)" werden sonst Beziehungen zwischen den Tabellen definiert. Da ich keine gesehen habe, habe ich es mal mit "interne_id>0" gemacht.

        Wenn Du als OS Windows einsetzt, kann ich Dir MySQL-Front an Dein Herz legen. Für den lokalen Gebauch weit aus mehr geeignet als phpMyAdmin.
        http://mysqlfront.venturemedia.de/index.php?act=ST&f=2&t=328

        MfG, André Laugks

        --
        L-Andre @ gmx.de
        1. Hallo Andre

          SELECT
              a.referenz_nr AS ref_nr_1,
              b.referenz_nr As ref_nr_2,
              c.referenz_nr As ref_nr_3
          FROM
              best_beantragt AS a LEFT JOIN best_offen AS b ON (a.interne_id>0 OR b.interne_id>0)
              LEFT JOIN best_ausgeliefert AS c ON (c.interne_id>0)
          WHERE
              a.referenz_nr = "abcdef
              OR
              b.referenz_nr = "abcdef"
              OR
              c.referenz_nr = "abcdef";

          In den Klammern "(a.interne_id>0 OR b.interne_id>0)" werden sonst Beziehungen zwischen den Tabellen definiert. Da ich keine gesehen habe, habe ich es mal mit "interne_id>0" gemacht.

          Ich habe zwischen den Tabellen keine eindeutigen Beziehungen definiert, weil sie eigentlich in keinem Zusammenhang zueinander stehen und als eigenständige Tabellen anzusehen sind. Ich möchte einfach nur in einer SQL Abfrage alle referenz_nr aus den Datenbanken auslesen und somit einen Vergleich starten, ob diese Nummer schon vergeben ist, oder nicht (diese Nr kann nämlich vom Benutzer selbst definiert werden, deswegen die Überprüfung).

          Geht das nur über eben diese Joins in Verbindung mit einem eindeutigen Key?

          Wenn Du als OS Windows einsetzt, kann ich Dir MySQL-Front an Dein Herz legen. Für den lokalen Gebauch weit aus mehr geeignet als phpMyAdmin.
          http://mysqlfront.venturemedia.de/index.php?act=ST&f=2&t=328

          Danke für den Tipp!

          mfg,
          Daniel

          1. Hallo Daniel!

            Ich würde es mit Union lösen:

            select referenz_nr from best_beantragt where referenz_nr = 'abcdef'
            union
            select referenz_nr from best_offen where referenz_nr = 'abcdef'
            union
            select referenz_nr from best_ausgeliefert where referenz_nr = 'abcdef';

            Wenns ein Datensatz zurückgeliefert wird, ist die referenz_nr bereits in Verwendung.

            mfg

            norbert =:-)

            1. Servus Norbert:-)

              Ich würde es mit Union lösen:

              select referenz_nr from best_beantragt where referenz_nr = 'abcdef'
              union
              select referenz_nr from best_offen where referenz_nr = 'abcdef'
              union
              select referenz_nr from best_ausgeliefert where referenz_nr = 'abcdef';

              Wenns ein Datensatz zurückgeliefert wird, ist die referenz_nr bereits in Verwendung.

              mysql liefert mir einen Fehler mit der Abfrage zurück:

              MySQL meldet:

              You have an error in your SQL syntax near 'UNION  SELECT referenz_nr FROM best_offen WHERE referenz_nr =  'abcdef' UNION  S' at line 1

              rein optisch scheint der String ja in Ordnung zu sein

              mfg,
              Daniel

              1. Hallo Daniel!

                1.) "UNION is implemented in MySQL 4.0.0."
                Ich kenne deine Version nicht - aber daran kanns auch liegen ;-)
                Wenn Du kleiner 4 verwendest, erreichst Du einfach mit drei einzelnen Abfragen das selbe Ergebnis.

                2.) Wenn nicht, kanns nur eine Kleinigkeit an der Syntax sein - hier findest Du mehr:

                http://www.mysql.com/doc/en/UNION.html

                mfg

                norbert =:-)

                1. Hi Norbert

                  1.) "UNION is implemented in MySQL 4.0.0."
                  Ich kenne deine Version nicht - aber daran kanns auch liegen ;-)
                  Wenn Du kleiner 4 verwendest, erreichst Du einfach mit drei einzelnen Abfragen das selbe Ergebnis.

                  Genau das wollte ich auch gerade im internet gefunden :), meine Version ist nämlich 3.23.x

                  Naja, man kann ja nicht alles haben :)

                  mfg,
                  Daniel

                  1. lol

                    Genau das wollte ich auch gerade im internet gefunden :), meine Version ist nämlich 3.23.x

                    korrigiere, wollte --> habe :) , das kommt davon wenn man mit den Gedanken wieder einmal ganz woanders ist