backbone: /mysql: seltsames ereignis beim abfragen von zwei tabellen

moin leute.

habe nen kleine problem mit ein mysql-abfrage.

"SELECT * FROM tabelle1,tabelle2";

wenn ich das so schreibe und mir mit mysql_fetch_array die daten in ein array schreiben lasse und die dann auslese dann werden nicht nur zwei zweilen ausgegeben (da sich zwei datensätze in jeder tabelle befinden) sondern es erschein alles doppelt. also:

auto1
auto2
auto1
auto2

kann mir jemand sagen wie das zustandekommt unr mir helfen das problem zu lösen?

thx,

tschau

  1. Hallo backbone!

    "SELECT * FROM tabelle1,tabelle2";

    auto1
    auto2
    auto1
    auto2

    kann mir jemand sagen wie das zustandekommt unr mir helfen das problem zu lösen?

    Ich kann Dir das nicht sagen, aber mach doch eh besser folgende Abfrage:
    SELECT tabelle1.spaltenname,tabelle2.spaltenname FROM tabelle1,tabelle2

    Damit sollte es eigentlich klappen.

    MfG
    Götz

    --
    Losung und Lehrtext für Dienstag, 16. September 2003
    Auf dich, Herr, sehen meine Augen; ich traue auf dich, gib mich nicht in den Tod dahin. (Psalm 141,8)
    Der Sünde Sold ist der Tod; die Gabe Gottes aber ist das ewige Leben in Christus Jesus, unserm Herrn. (Römer 6,23)
    (http://www.losungen.de/heute.php3)
    1. Hallo Götz,

      SELECT tabelle1.spaltenname,tabelle2.spaltenname FROM tabelle1,tabelle2
      Damit sollte es eigentlich klappen.

      Nein, siehe mein Posting. ;-)

      Aber ich stimme Dir zu, dass die direkte Abfrage nach Spaltennamen sinnvoller ist als ein SELECT *.

      Viele Grüße,
      Christian

      1. Hallo Christian!

        Nein, siehe mein Posting. ;-)

        Ja. Stimmt. Du hast natürlich Recht ;)
        Aber solche Abfragen macht man auch nicht! *g*

        Aber ich stimme Dir zu, dass die direkte Abfrage nach Spaltennamen sinnvoller ist als ein SELECT *.

        Wenigstens war ein Teil meines Postings richtig ;)

        MfG
        Götz

        --
        Losung und Lehrtext für Dienstag, 16. September 2003
        Auf dich, Herr, sehen meine Augen; ich traue auf dich, gib mich nicht in den Tod dahin. (Psalm 141,8)
        Der Sünde Sold ist der Tod; die Gabe Gottes aber ist das ewige Leben in Christus Jesus, unserm Herrn. (Römer 6,23)
        (http://www.losungen.de/heute.php3)
  2. Hallo backbone,

    "SELECT * FROM tabelle1,tabelle2";

    Autsch.

    Du bekommst hier ein kartesisches Produkt:

    mir mit mysql_fetch_array die daten in ein array schreiben lasse und die dann auslese dann werden nicht nur zwei zweilen ausgegeben (da sich zwei datensätze in jeder tabelle befinden) sondern es erschein alles doppelt.

    Klar. In zwei Tabellen gibt es jeweils zwei Datensätze. Die Anzahl der Datensätze bei einer Abfrage ohne Bedingung ist also (anz. Zeilen Tab. 1) mal (anz. Zeilen Tab. 2) = 4. Wenn Deine Tabellen so aussehen:

    Tabelle1     Tabelle2
    +---+---+    +---+---+
    | a | b |    | c | d |
    +---+---+    +---+---+
    | 1 | 2 |    | 5 | 6 |
    | 3 | 4 |    | 7 | 8 |
    +---+---+    +---+---+

    Dann wird bei einem SELECT * FROM tabelle1, tabelle2 das Ergebnis so aussehen:

    +---+---+---+---+
    | a | b | c | d |
    +---+---+---+---+
    | 1 | 2 | 5 | 6 |
    | 3 | 4 | 5 | 6 |
    | 1 | 2 | 7 | 8 |
    | 3 | 4 | 7 | 8 |
    +---+---+---+---+

    (das ist das kartesische Produkt)

    Die Sortierreihenfolge könnte sich natürlich etwas unterscheiden, je nachdem, wie die Daten in der Tabell gespeichert sind sowie der Optimizer die Tabellen verknüpft.

    mir helfen das problem zu lösen?

    Du musst die Tabellen über irgendeine Bedingung verknüpfen.

    Viele Grüße,
    Christian

    1. moin!

      Du musst die Tabellen über irgendeine Bedingung verknüpfen.

      thx, werd mir das nachher gleich mal angucken. deine erklärung klingt sehr logisch. es lang daran das ich gedacht habe das die tabellendaten anderes ausgelesen werden.

      thx und tschau

      1. hallo nochmal...

        nachdem ich jetzt zeit hatte die vorschläge auszuprobieren muss ich sagen: ich komme nicht mehr weiter. das funktioniert einfach nicht so wie ich will... z.b mit DISTINCT. kann mir jemand sagen wie ich zwei tabellen für eine abfrage verknüpfe?

        thx

        1. Hallo backbone,

          kann mir jemand sagen wie ich zwei tabellen für eine abfrage verknüpfe?

          Ein Beispiel:

          Du hast eine Tabelle Kunden und eine Tabelle Bestellungen.

          Die Tabelle Kunden sieht so aus:

          +------------+----------------------+-------------------------+
          | KundenNr   | Name                 | Adresse                 |
          +------------+----------------------+-------------------------+
          | 1          | backbone             | sonstwo 1               |
          | 2          | Christian Seiler     | sonstwo 2               |
          +------------+----------------------+-------------------------+

          Deine Tabelle Bestellungen sieht so aus:

          +------------+--------------+-------------+------------+
          | RechnNr    | KundenNr     | Zahlungsart | RechnDatum |
          +------------+--------------+-------------+------------+
          | 1          | 1            | Lastschrift | 02.09.2003 |
          | 2          | 1            | Nachnahme   | 05.09.2003 |
          | 3          | 2            | Nachnahme   | 07.09.2003 |
          +------------+--------------+-------------+------------+

          Wenn Du nun diese beiden Tabellen verknüpfen willst, dann brauchst Du ein Kriterium, um das zu tun. Dies wäre hier die Kunden-Nr.

          Beispiel:

          SELECT Bestellungen.RechnNr, Kunden.KundenNr, Kunden.Name AS Kunde, Kunden.Adresse, Bestellungen.Zahlungsart, Bestellungen.RechnDatum FROM Bestellungen, Kunden WHERE Kunden.KundenNr = Bestellungen.KundenNr ORDER BY RechnNr ASC;

          Ergibt:

          +---------+----------+------------------+-----------+-------------+------------+
          | RechnNr | KundenNr | Kunde            | Adresse   | Zahlungsart | RechnDatum |
          +---------+----------+------------------+-----------+-------------+------------+
          | 1       | 1        | backbone         | sonstwo 1 | Lastschrift | 02.09.2003 |
          | 2       | 1        | backbone         | sonstwo 1 | Nachnahme   | 05.09.2003 |
          | 3       | 2        | Christian Seiler | sonstwo 2 | Nachnahme   | 07.09.2003 |
          +---------+----------+------------------+-----------+-------------+------------+

          Wenn Du jetzt immer noch nicht klarkommst, solltest Du uns verraten, was für Tabellen Du hast bzw. wie Du sie verknüpfen willst.

          Viele Grüße,
          Christian

          PS: Achja, DISTINCT sollte in 99% aller Fälle durch gutes Datenbankdesign überflüssig sein.

          1. moin!

            Beispiel:

            SELECT Bestellungen.RechnNr, Kunden.KundenNr, Kunden.Name AS Kunde, Kunden.Adresse, Bestellungen.Zahlungsart, Bestellungen.RechnDatum FROM Bestellungen, Kunden WHERE Kunden.KundenNr = Bestellungen.KundenNr ORDER BY RechnNr ASC;

            danke für das sehr lehrreich bsp.! jetzt hat selbst lieb marcus ;) das verstand und weiss wie es geht. eine frage habe ich nur nochmal: wieso "bindest" du Kunden.Name an Kunde?

            tschau und big thx.

            marcus

            1. Hallo backbone,

              eine frage habe ich nur nochmal: wieso "bindest" du Kunden.Name an Kunde?

              SELECT ....., Kunden.Name AS Kunde, ....

              Kannst Du prinzipiell mit jeder Spalte machen. Du kannst auch Funktionen anwenden, z.B.

              SELECT ...., CONCAT("Ich bin ", Kunden.Name, "!") AS Selbstvorstellung, .....

              Dann steht im Ergebnis:

              ... -+---------------------------+- ...
              ...  | Selbstvorstellung         |  ...
              ... -+---------------------------+- ...
              ...  | Ich bin backbone!         |  ...
              ...  | Ich bin backbone!         |  ...
              ...  | Ich bin Christian Seiler! |  ...
              ... -+---------------------------+- ...

              (ja, ich weiß, es gibt bessere Beispiele)

              Wenn Du das AS Selbstvorstellung weglassen würdest, dann würde es (ungefähr) so aussehen:

              ... -+-----------------------------+- ...
              ...  | CONCAT("Ich bin ",Name,"!") |  ...
              ... -+-----------------------------+- ...
              ...  | Ich bin backbone!           |  ...
              ...  | Ich bin backbone!           |  ...
              ...  | Ich bin Christian Seiler!   |  ...
              ... -+-----------------------------+- ...

              Viele Grüße,
              Christian

  3. Hi,

    habe nen kleine problem mit ein mysql-abfrage.
    "SELECT * FROM tabelle1,tabelle2";
    wenn ich das so schreibe und mir mit mysql_fetch_array die daten in ein array schreiben lasse und die dann auslese dann werden nicht nur zwei zweilen ausgegeben (da sich zwei datensätze in jeder tabelle befinden) sondern es erschein alles doppelt. also:

    Da keinerlei Einschränkung gemacht wird, wird das komplette Kreuzprodukt ausgegeben, sprich:
    jeder Datensatz von tabelle1 wird mit jedem Datensatz von tabelle2 kombiniert zu einem Datensatz der Ergebnismenge.

    kann mir jemand sagen wie das zustandekommt unr mir helfen das problem zu lösen?

    s.o., zur Lösung: Ergebnismenge einschränken (WHERE ...)

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
  4. "SELECT * FROM tabelle1,tabelle2";

    hi,
    ich hab noch nie das bedürfniss gehabt zwei tabellen auf einmal abzufragen ... aber könnte SELECT DISTINCT * FROM tabelle1,tabelle2;
    das erwünscht ergebnis bringen ??

    mfg

    bernd

    1. moin!

      ich hab noch nie das bedürfniss gehabt zwei tabellen auf einmal abzufragen ...

      naja, es wurde auch noch nie sowas tolle programmiert wie ich es gerade mache ;) :D

      tschau