Daniel: Datensatz wird statt 1mal 5mal zurückgegeben

Hallo zu später Stunde,

Ich habe hier ein kleines mysql Problem, und zwar lese ich aus 2 tabellen dessen Struktur fast gleich ist ein paar Felder mit dem gleichen Feldnamen aus:

SELECT t1.lieferschein_nr,t1.abs_anrede,t1.abs_name,t1.abs_firmenname,t1.abs_adresse,t1.abs_plz, t1.abs_ort,t1.abs_land,t1.empf_anrede,t1.empf_name,t1.empf_firmenname,t1.empf_adresse,t1.empf_plz, t1.empf_ort,t1.empf_land,t1.gewicht,t1.bestellung,t1.rechnungsempfaenger,t1.zahler_anrede, t1.zahler_name,t1.zahler_firmenname,t1.zahler_adresse,t1.zahler_plz,t1.zahler_ort,t1.zahler_land, t2.lieferschein_nr,t2.abs_anrede,t2.abs_name,t2.abs_firmenname,t2.abs_adresse,t2.abs_plz, t2.abs_ort,t2.abs_land,t2.empf_anrede,t2.empf_name,t2.empf_firmenname,t2.empf_adresse,t2.empf_plz, t2.empf_ort,t2.empf_land,t2.gewicht,t2.bestellung,t2.rechnungsempfaenger,t2.zahler_anrede, t2.zahler_name,t2.zahler_firmenname,t2.zahler_adresse,t2.zahler_plz,t2.zahler_ort,t2.zahler_land
FROM
best_offen as t1,best_ausgeliefert as t2
WHERE
t1.sendungs_id = "s-2f3f19bddb35c39" OR t2.sendungs_id = "s-2f3f19bddb35c39"

Funktioniert eigentlich ganz gut, nur komischerweise bekomme ich 5x den gleichen Datensatz zurückgegeben, obwohl er nur 1x in beiden Tabellen vorkommt.

Mit Sql Explain bekomme ich diese Werte zurück, vielleicht kann euch das helfen:

table  type  possible_keys  key  key_len  ref  rows  Extra
t1 ALL NULL NULL NULL NULL 2
t2 ALL NULL NULL NULL NULL 5 where used

Wäre dankbar für eure Hilfe,

Grüsse,
Daniel

  1. Hi

    FROM
    best_offen as t1,best_ausgeliefert as t2
    WHERE
    t1.sendungs_id = "s-2f3f19bddb35c39" OR t2.sendungs_id = "s-2f3f19bddb35c39"

    Frage:
    Worüber soll denn das DBMS die beiden Tabellen zusammenführen? Man möge mich verbessern wenn ich falsch liege, aber ein
    AND t1.joinspalte = t2.joinspalte (mit entsprechenden Spaltennamen)
    könnte das Problem lösen. Wenn nicht, dann kann folgendes passieren:
    Nehmen wir an, beide Tabellen hätten eine Spalte ID und in Tabelle 1 käme ein Mal der Wert sendungs_id vor, dieser Datensatz habe als ID eine 1. Nun sei in der zweiten Tabelle die ID 1 5 mal vorhanden, die sendungs_id nicht.
    Dann geht das DBMS hin, sucht diese sendungs_id, findet die ID 1 und erinnert sich daran, dass die Tabellen noch gejoint werden müssen. Nun sagt er sich, die Spalten ID heißen gleich, da ich nix anderes gesagt bekomme joine ich einfach darüber und spontan wird der 1 Datensatz aus t1 mit den 5 Datensätzen aus t2 ergänzt (Ergebnis 5 Datensätze).

    ...Ich mag mich aber irren und das Problem ist ganz wo anders...

    MfG
    Rouven

    --

    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. Hallo Rouven,

      FROM
      best_offen as t1,best_ausgeliefert as t2
      WHERE
      t1.sendungs_id = "s-2f3f19bddb35c39" OR t2.sendungs_id = "s-2f3f19bddb35c39"
      Frage:
      Worüber soll denn das DBMS die beiden Tabellen zusammenführen? Man möge mich verbessern wenn ich falsch liege, aber ein
      AND t1.joinspalte = t2.joinspalte (mit entsprechenden Spaltennamen)
      könnte das Problem lösen. Wenn nicht, dann kann folgendes passieren:
      Nehmen wir an, beide Tabellen hätten eine Spalte ID und in Tabelle 1 käme ein Mal der Wert sendungs_id vor, dieser Datensatz habe als ID eine 1. Nun sei in der zweiten Tabelle die ID 1 5 mal vorhanden, die sendungs_id nicht.
      Dann geht das DBMS hin, sucht diese sendungs_id, findet die ID 1 und erinnert sich daran, dass die Tabellen noch gejoint werden müssen. Nun sagt er sich, die Spalten ID heißen gleich, da ich nix anderes gesagt bekomme joine ich einfach darüber und spontan wird der 1 Datensatz aus t1 mit den 5 Datensätzen aus t2 ergänzt (Ergebnis 5 Datensätze).

      Danke erst einmal für deine Antwort, aber ich möchte nur noch dazu sagen, das der Wert sendungs_id über diese 2 tabellen unique ist und immer nur max 1x vorkommen kann, das wird schon vorher überprüft.
      Ich möchte nur mittels SQL in einer Abfrage feststellen in welcher Tabelle sich dieser Datensatz befindet und gleich anschliessend auslesen. Mit den Joins und so kenne ich mich nicht so gut aus, deswegen stehe ich hier monentan etwas an.

      Grüsse,
      Daniel

      1. Morgen,

        also pass auf, das Problem ist meine ich folgendes:
        Wenn du einen JOIN über zwei Tabellen machen würdest, dann müsstest du der DB sagen welche Spalte in den Tabellen gleich sein soll, damit es aus den 2 Tabellen den 1 Datensatz auslesen kann
        SELECT nachnamen.name, vornamen.vorname
        FROM nachnamen INNER JOIN vornamen
        ON nachnamen.namenid = vornamen.namenid
        WHERE nachname = 'mueller' OR vorname = 'hansi'

        D.h. (die Reihenfolge jetzt mal außer Acht gelassen) er führt die beiden Tabllen zusammen, macht aus allem 1 Datensatz wo die namenid beider Tabellen übereinstimmt und filtert dann anschließend anhand von nachname und vorname im WHERE die interessanten Datensätze heraus.

        Bei deiner Abfrage benutzt du quasi so einen "impliziten" JOIN indem du einfach tabelle1, tabelle2 schreibst. Wenn du jetzt nicht im WHERE Kriterium ein Kriterium angibst (unabhängig von sendungs_id), in dem beide Tabellen übereinstimmen müssen damit es eine gültige Ergebniskombination ist, dann wird sich die Datenbank wahrscheinlich überlegen, wie sie die beiden Tabellen zusammenführen kann - was das Ergebnis ist? Who knows...

        MfG
        Rouven

        --

        -------------------
        ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
        1. Guten Morgen, Rouven

          also pass auf, das Problem ist meine ich folgendes:
          Wenn du einen JOIN über zwei Tabellen machen würdest, dann müsstest du der DB sagen welche Spalte in den Tabellen gleich sein soll, damit es aus den 2 Tabellen den 1 Datensatz auslesen kann
          SELECT nachnamen.name, vornamen.vorname
          FROM nachnamen INNER JOIN vornamen
          ON nachnamen.namenid = vornamen.namenid
          WHERE nachname = 'mueller' OR vorname = 'hansi'

          Ja genau, aber ich habe das zusätzliche Problem, dass die 2 Tabellen in keiner Relation zueinander stehen, sie sind zwar ähnlich aufgebaut, aber jeder Eintrag ist einzigartig, also kann ich sie nicht über einen Schlüssel Joinen. :(

          D.h. (die Reihenfolge jetzt mal außer Acht gelassen) er führt die beiden Tabllen zusammen, macht aus allem 1 Datensatz wo die namenid beider Tabellen übereinstimmt und filtert dann anschließend anhand von nachname und vorname im WHERE die interessanten Datensätze heraus.

          Ich habe mich etwas im Internet umgeschaut und herausgefunden, das ich einen Cross Join verwendet habe, bei all den anderen Joins (soweit ich gesehen habe) braucht man einen Schlüssel, den ich aber nicht habe.Deswegen kommen auch die 5 Datensätze zustande, da er jeden gefundenen Datensatz in Tabelle1 mit dem anderen Datensatz in Tabelle 2 vergleicht. Ich müsste das nur noch irgendwie auf einen beschränken können.

          Bei deiner Abfrage benutzt du quasi so einen "impliziten" JOIN indem du einfach tabelle1, tabelle2 schreibst. Wenn du jetzt nicht im WHERE Kriterium ein Kriterium angibst (unabhängig von sendungs_id), in dem beide Tabellen übereinstimmen müssen damit es eine gültige Ergebniskombination ist, dann wird sich die Datenbank wahrscheinlich überlegen, wie sie die beiden Tabellen zusammenführen kann - was das Ergebnis ist? Who knows...

          Leider habe ich auch keinen anderen Wert den ich vergleichen könnte, da die Tabellen wie gesagt unabhängig voneinander sind und jeder Eintrag nur 1x existiert.

          Tut mir leid falls ich dich mit für dich wahrscheinlich lächerlichen Fragestellungen konfrontiere, aber ich habe bis jetzt eigentlich eher mehr mit simplen Datenbankabfragen gearbeitet, und demnach auch noch nicht so eine Routine darin wie manch anderer :)

          Grüsse,
          Daniel

          1. Hi Daniel,

            Also das mit Tabellenabfragen über 2 unverknüpfte tabellen um zu sehen in welcher tabelle etwas vorkommt klappt meines wissens nicht.

            Warum brauchst du das überhaupt? Sprich was spricht gegen 2 abfragen? Kommt wert in tabelle 1 vor - ja/nein, Kommt wert in tabelle 2 vor - ja/nein und dann mit den resultaten arbeiten?

            Gruß
            Netghost

            1. Hallo Ihr,

              Warum brauchst du das überhaupt? Sprich was spricht gegen 2 abfragen? Kommt wert in tabelle 1 vor - ja/nein, Kommt wert in tabelle 2 vor - ja/nein und dann mit den resultaten arbeiten?

              In Anbetracht dieser Situation, dass die Tabellen eigentlich gar nicht nebeneinander gehören sondern sich quasi gegenseitig ausschließen, würde ich entweder diese 2-Abfragen-Lösung vorschlagen, oder mich - abhängig von der verwendeten Datenbank - nach dem UNION-Befehl umschauen, der könnte dann mögliche Ergebnisse untereinander setzen...

              MfG
              Rouven

              --

              -------------------
              ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  2. Hi!

    Vielleicht isses ja zu simpel, aber warum machst du nicht einfach eine Abfrage für Tabelle 1 und eine Abfrage für Tabelle 2.

    Wenn die wirklich in keiner Relation zueinander stehen, verstehe ich sowieso nicht, warum du hier nur eine Abfrage gemacht hast, mkit den beiden Tabellen zusammen.

    Offensichtlich findet er das Ergebnis in Tabelle 1, und da er keine Beziehung zu der anderen Tabelle findet, stellt er einfach eine Beziehung mit allen Reihen der anderen Tabelle her. Deshalb sind es 5 Datensätze.

    Gruß
    Maggus

    1. Hallo Markus

      Vielleicht isses ja zu simpel, aber warum machst du nicht einfach eine Abfrage für Tabelle 1 und eine Abfrage für Tabelle 2.

      Wenn die wirklich in keiner Relation zueinander stehen, verstehe ich sowieso nicht, warum du hier nur eine Abfrage gemacht hast, mkit den beiden Tabellen zusammen.

      Offensichtlich findet er das Ergebnis in Tabelle 1, und da er keine Beziehung zu der anderen Tabelle findet, stellt er einfach eine Beziehung mit allen Reihen der anderen Tabelle her. Deshalb sind es 5 Datensätze.

      Ja, stimmt das wäre eine einfache Lösung, ich wollte aber probieren das ganze mit einer Abfrage zu machen, da es etwas schneller ist.Falls es nicht funktionieren sollte, kann ich es eh nur so machen :(

      Trotzdem danke,

      Grüsse,
      Daniel

      1. Hi Daniel,

        Ja, stimmt das wäre eine einfache Lösung, ich wollte aber probieren das ganze mit einer Abfrage zu machen, da es etwas schneller ist.

        Deine Abfrage ist um ein _Vielfaches_ langsamer als zwei separate Anforderungen.

        Der Operator, den Du suchst, heißt übrigens "UNION".

        Viele Grüße
              Michael

        --
        T'Pol: I apologize if I acted inappropriately.
        V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
        (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
         => http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A|+fo%3A}+ch%3A]+rl%3A(+br%3A^+n4%3A(+ie%3A%25+mo%3A)+va%3A|+de%3A%2F+zu%3A|+fl%3A(+ss%3A)+ls%3A~+js%3A|
        Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.