Vorheriges Thema: Nächstes Thema: |
Autor |
Nachricht |
Simon Gast
|
Verfasst am: 03.05.2005 10:33:08 Titel: Mehrere Daten aus verschiedenen Tabellen auslesen [PHP] |
|
|
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
|
Verfasst am: 03.05.2005 11:22:14 Titel: |
|
|
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 |
|
|
Simon Häufiger Poster
Anmeldungsdatum: 03.05.2005 Beiträge: 195 Wohnort: Schweiz
|
Verfasst am: 03.05.2005 12:20:01 Titel: |
|
|
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 |
|
|
admin Site Admin
Anmeldungsdatum: 16.01.2005 Beiträge: 323 Wohnort: Berlin
|
|
Nach oben |
|
|
Simon Häufiger Poster
Anmeldungsdatum: 03.05.2005 Beiträge: 195 Wohnort: Schweiz
|
Verfasst am: 03.05.2005 12:28:31 Titel: |
|
|
Lässt sich eigentlich einfach beheben: NOT NULL
Frage 2:
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
Wie schon gesagt. Ich habs mit SQL nicht so |
|
Nach oben |
|
|
admin Site Admin
Anmeldungsdatum: 16.01.2005 Beiträge: 323 Wohnort: Berlin
|
Verfasst am: 03.05.2005 12:49:21 Titel: |
|
|
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 |
|
|
Simon Häufiger Poster
Anmeldungsdatum: 03.05.2005 Beiträge: 195 Wohnort: Schweiz
|
|
Nach oben |
|
|
admin Site Admin
Anmeldungsdatum: 16.01.2005 Beiträge: 323 Wohnort: Berlin
|
Verfasst am: 03.05.2005 18:36:17 Titel: |
|
|
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 |
|
|
Simon Häufiger Poster
Anmeldungsdatum: 03.05.2005 Beiträge: 195 Wohnort: Schweiz
|
Verfasst am: 03.05.2005 19:10:46 Titel: |
|
|
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 |
|
Nach oben |
|
|
admin Site Admin
Anmeldungsdatum: 16.01.2005 Beiträge: 323 Wohnort: Berlin
|
Verfasst am: 04.05.2005 09:49:11 Titel: |
|
|
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 |
|
|
Simon Häufiger Poster
Anmeldungsdatum: 03.05.2005 Beiträge: 195 Wohnort: Schweiz
|
|
Nach oben |
|
|
admin Site Admin
Anmeldungsdatum: 16.01.2005 Beiträge: 323 Wohnort: Berlin
|
Verfasst am: 04.05.2005 12:24:08 Titel: |
|
|
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 |
|
|
Simon Häufiger Poster
Anmeldungsdatum: 03.05.2005 Beiträge: 195 Wohnort: Schweiz
|
Verfasst am: 04.05.2005 12:42:04 Titel: |
|
|
Juhu, es kappt. Und das beste: Ich weis sogar warum
Aber selbst währe ich warscheinlich nie darauf gekommen
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 ...
Simon |
|
Nach oben |
|
|
|