HTMLWorld - HTML, CSS, JavaScript, PHP, Java, Flash und vieles mehrHTMLWorld:   Home | Impressum
 

 
 

Anzeige 
 
HTMLWorld » Forum

Thema anzeigen - Mehrere Daten aus verschiedenen Tabellen auslesen [PHP]

 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Mehrere Daten aus verschiedenen Tabellen auslesen [PHP]

 

Neues Thema eröffnen   Neue Antwort erstellen    HTMLWorld Foren-Übersicht
   MySQL
Vorheriges Thema:
Nächstes Thema:  
Autor Nachricht
Simon
Gast





BeitragVerfasst am: 03.05.2005 10:33:08    Titel: Mehrere Daten aus verschiedenen Tabellen auslesen [PHP] Antworten mit Zitat

Hallo Leuz

Ich habe hier nicht so den Durchblick, deshalb schreibe ich es hier mal rein. Ich habe zwei Tabellen: user und rang
Diese sehen ungefähr so aus:
User:
| id | nick | rang |
| 1 | abc | 2 |

Die Tabelle rang beinhaltet die Ränge:
rang:
| id | rangname |
| 1 | rang 1 |
| 2 | rang 2 |
| 3 | rang 3 |
| 4 | rang 4 |

Ich möchte jetzt id, nick und den Rang in Worten auslesen (user.rang ist aus rang.id)
Meine Ãœberlegung:
Code:
$erg=mysql_query("SELECT user.id,rang.rangname FROM user,rang LEFT JOIN rang ON (user.rang=rang.id) WHERE nick='nick1');


Das Problem ist, ich weis nicht mal ob LEFT JOIN die richtige Funktion dafür ist...

Schon im Voraus vielen Dank für Eure Bemühungen.

Simon
Ps. Ach ja, könntet Ihr vielleicht eine kleine Erklährung dazu schreiben, nicht nur den korrekten Code?
Nach oben
admin
Site Admin


Anmeldungsdatum: 16.01.2005
Beiträge: 323
Wohnort: Berlin

BeitragVerfasst am: 03.05.2005 11:22:14    Titel: Antworten mit Zitat

die leute denken immer zu kompliziert. das sehe ich bei meinen kunden auch immer. da wird ständig zu den abstrusesten joins und unions und wasweissichnochalles gegriffen wo die lösung doch so einfach ist:

Code:
SELECT * FROM user, rang WHERE user.rang = rang.id AND user.nick = "ich"

... oder zu deutsch: Nimm alle aus user und rang bei denen der rang des users mit der id des rangs übereinstimmen und bei dem der user "ich" heisst.

zur veranschauung:

User:
| id | nick | rang |
| 1 | abc | 2 |
| 2 | def | 1 |

rang:
| id | rangname |
| 1 | rang 1 |
| 2 | rang 2 |

daraus wird folgende imaginäre tabelle zusammen gesetzt:
| id | nick | rang | id | rangname |
| 1 | abc | 2 | | 2 | rang 2 |
| 2 | def | 1 | | 1 | rang 1 |

und davon nimmt er sich dann die zeile bei der nick = sowieso is ...

verständlich?

gruss,
jan.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
Simon
Häufiger Poster


Anmeldungsdatum: 03.05.2005
Beiträge: 195
Wohnort: Schweiz

BeitragVerfasst am: 03.05.2005 12:20:01    Titel: Antworten mit Zitat

Hallo

Danke für die schnelle Antwort.

Das hab ich eben auch schon probiert, und es hat nicht richtig geklappt. Wenn in der zeile user.rang NULL steht, wird kein Ergebniss ausgespuckt.

Code:
$erg=mysql_query("SELECT * FROM user, rang WHERE user.rang = rang.id AND user.id = '1'") or die("Fehler");
echo mysql_num_rows($erg);

Ergebnis 0

Code:
$erg=mysql_query("SELECT * FROM user, rang WHERE user.id = '1'") or die("Fehler");
echo mysql_num_rows($erg);

Ergebnis 4

Am Schluss kommen noch einige rangähnliche Tabellen hinzu. Und wenn eine NULL ist, wird das ganze abgebrochen

Code:
SELECT * FROM user, rang, style WHERE user.rang = rang.id AND user.style = style.id AND user.id = '1'

Ergebniss 0

Gruss Simon
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
admin
Site Admin


Anmeldungsdatum: 16.01.2005
Beiträge: 323
Wohnort: Berlin

BeitragVerfasst am: 03.05.2005 12:26:37    Titel: Antworten mit Zitat

wie wärs mit:

Code:
... WHERE (user.rang = rang.id OR user.rang IS NULL) AND ...


ein bischen selbständiges denken Wink

gruss,
jan.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
Simon
Häufiger Poster


Anmeldungsdatum: 03.05.2005
Beiträge: 195
Wohnort: Schweiz

BeitragVerfasst am: 03.05.2005 12:28:31    Titel: Antworten mit Zitat

Lässt sich eigentlich einfach beheben: NOT NULL Very Happy

Frage 2:
Very Happy
Was bewirkt denn LEFT JOIN genau? Nachgelesen hab ich, aber ein Beispiel fällt mir dazu nicht ein

Simon
[edit] Sry, hab deinen Beitrag nicht mehr gesehen. Ist natürlich auch ne Möglichkeit Very Happy
Wie schon gesagt. Ich habs mit SQL nicht so Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
admin
Site Admin


Anmeldungsdatum: 16.01.2005
Beiträge: 323
Wohnort: Berlin

BeitragVerfasst am: 03.05.2005 12:49:21    Titel: Antworten mit Zitat

left join:
http://www.html-world.de/program/mysql_5.php#select
(etwas weiter unten)

der unterschied wird erst bei komplexeren strukturen klarer.

ein beispiel: vorausgesetz es gibt zwei tabellen t1 und t2 die foglenden inhalt haben:
t1:
id - cont
1 - a
2 - b
3 - c

t2:
id - cont
4 - a
2 - b
3 - c


dann ergibt
Code:
SELECT * FROM t1,t2 WHERE t1.id = t2.id

zwei zeilen (eben die zeilen mit id = 2 und id = 3, weil ja 1 bzw. 4 verschieden sind)
bei
Code:
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id

sind aber alle zeilen aus t1 vertreten und werden passend verknüpft. einzig die zeile mit t1.id = 1 wird mit NULL verknüpft da kein passender eintrag in t2 gefunden wird.


gruss,
jan.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
Simon
Häufiger Poster


Anmeldungsdatum: 03.05.2005
Beiträge: 195
Wohnort: Schweiz

BeitragVerfasst am: 03.05.2005 18:18:13    Titel: Antworten mit Zitat

Entschuldigt, wenn ich hier nochmals Frage, aber ich bin auf dem Gebiet nicht so der hellste Very Happy
Und hier ist mir schnell geholfen worden...

Code:
SELECT maps.mapname, maps.mapname
FROM  maps WHERE
user.erstemap = maps.id AND
user.zweitemap = maps.id  AND
user.id='1'


Folgendes.
Zwei Tabellen:
Tabelle User mit ID | erstemap | zweitemap
gefüllt mit ID=1 erstemap=1 zweitemap=2

Eine Tabelle called maps mit allen Maps
id=1 mapname=hallo
id=2 mapname=beta
id=3 mapname=hallo3...

Ich möchte jetzt, dass es mir die Map aus der Zeile erstemap und die Map aus der Zeile zweitemap ausliest.
Ich weis nicht, ob ich es oben jetzt zweimal selectieren muss, da ich es zwei mal will (allerdings verschieden).

Vielen Dank schon für Eure/Deine Bemühungen und deine Nerven Very Happy
Simon
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
admin
Site Admin


Anmeldungsdatum: 16.01.2005
Beiträge: 323
Wohnort: Berlin

BeitragVerfasst am: 03.05.2005 18:36:17    Titel: Antworten mit Zitat

sowas?

Code:
SELECT maps.mapname
FROM  maps WHERE
(user.erstemap = maps.id OR
user.zweitemap = maps.id)  AND
user.id='1'
GROUP BY maps.id
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
Simon
Häufiger Poster


Anmeldungsdatum: 03.05.2005
Beiträge: 195
Wohnort: Schweiz

BeitragVerfasst am: 03.05.2005 19:10:46    Titel: Antworten mit Zitat

Hmm, auch nicht so ganz. Er gibt mir alle Einträge aus der Tabelle Maps aus.

Hier nochmals wie ich es will.
user
| id | erste map | zweitemap |
| 1 | 1 | 5 |

maps
| id | mapname |
| 1 | England |
| 2 | Frankreich|
| 3 | Dänemark |
| 4 | Tschechien |
| 5 | Kongo |

Das Ergebnis sollte folgendermassen sein:
Die ID des Benutzers ist 1
Sein erstmals besuchtes Land ist England
und danach Kongo

Simon
Ps. Wenn es närven zum kaufen gäbe, würde ich Dir einige schicken Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
admin
Site Admin


Anmeldungsdatum: 16.01.2005
Beiträge: 323
Wohnort: Berlin

BeitragVerfasst am: 04.05.2005 09:49:11    Titel: Antworten mit Zitat

jetzt wird ein join fällig

Code:
SELECT * FROM user
LEFT JOIN maps as m1 on user.karte1 = m1.id
LEFT JOIN maps as m2 on user.karte2 = m2.id


passt?

gruss,
jan.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
Simon
Häufiger Poster


Anmeldungsdatum: 03.05.2005
Beiträge: 195
Wohnort: Schweiz

BeitragVerfasst am: 04.05.2005 10:45:40    Titel: Antworten mit Zitat

I'm defused

Code:

SELECT * FROM user
LEFT JOIN maps as m1 on user.karte1 = m1.id
LEFT JOIN maps as m2 on user.karte2 = m2.id


Ich nehme mal an, maps ist die Tabelle mit allen Ländern, user.karte1 ist die erste gewählte karte und user.karte2 die zweite (als id gewählt von maps). Was ist dann aber m1 und m2 (m2.id) Es gibt doch nur zwei Tabellen, maps und user

Gruss Simon
Ps. Ich kann nicht selber denken Very Happy
Habs auch ausprobiert, mit den verschiedenen Namen und so, hat aber nicht geklappt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
admin
Site Admin


Anmeldungsdatum: 16.01.2005
Beiträge: 323
Wohnort: Berlin

BeitragVerfasst am: 04.05.2005 12:24:08    Titel: Antworten mit Zitat

m1 = maps
m2 = maps

da:
... JOIN maps AS m1 ...
zu deutsch: verbinde maps als m1 ...

das ganze dient dazu die zwei maps-tabellen zu unterscheiden, weil ja letztlich maps mit maps verknüpft wird ...

langsam empfehle ich aber wirklich mal unsere mysql-doku zu lesen - schließlich steht da alles drin, was ich hier bisher erklärt habe ...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
Simon
Häufiger Poster


Anmeldungsdatum: 03.05.2005
Beiträge: 195
Wohnort: Schweiz

BeitragVerfasst am: 04.05.2005 12:42:04    Titel: Antworten mit Zitat

Juhu, es kappt. Und das beste: Ich weis sogar warum Very Happy
Aber selbst währe ich warscheinlich nie darauf gekommen Very Happy

Nur noch eine retorische Frage.
Wenn man einen Bandwurm als Abfrage hat (sehr viel aus einer DB liest), sollte man dies besser in mehrere kleine Abfragen aufteilen oder in einem lassen?

Vielen Dank für die Hilfe.
Wie ich sehe, läuft hier zur Zeit nicht viel, also kann ich hier noch viel Fragen ... Very Happy Very Happy

Simon
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    HTMLWorld Foren-Übersicht
   MySQL
Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.