/mysql: seltsames ereignis beim abfragen von zwei tabellen
backbone
- php
0 Götz0 Christian Seiler0 Götz
0 Christian Seiler0 backbone
0 MudGuard0 bernd boruttau0 backbone
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
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
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
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
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
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
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
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.
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
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
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
"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
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