PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL: Tabellen verknüpfen.



djaliced
28-05-2006, 15:18
Hallo,
ich habe mich schon "wund" gegoogelt aber ich werde einfach nicht schlauer. :(
Und zwar folgendes Problem. Ich programmiere grade eine Webpage (PHP5) für einen eSport-Clan und habe 2 Tabellen die verknüpft werden müssen.
Dazu muss ich noch sagen das ist MySQL-Neuling bin.:rolleyes:

Die eine Tabelle sieht so aus:


Tabellenname: member
ID | nickname | pb | tracker | memberrankID
-----------------------------------------------
1 | olly | 34 | 0815 | 1
2 | Werner | 33 | 0815 | 2
usw.

Die zweite Tabelle so:


Tabellenname: memberrank
ID | rank
------------------
1 | leader
2 | squadleader

usw.

Jetzt möcht ich die Tabellen verknüpfen.
Und zwar so -> Wenn ich eine Abfrage von Tabelle "member" mache, soll in der memberrankID gleich der passende inhalt von Tabelle memberrank stehen.
Sprich so:


ID = 1
nickname = olly
pd = 34
tracker = 0815
memberrankID = leader

und nicht


ID = 1
nickname = olly
pd = 34
tracker = 0815
memberrankID = 1

Ich weiß das ich beide Tabellen Selektieren muß. Und dann komme ich leider nicht weiter.
(Da gibt es auch noch ein JOIN-Befehl aber aus dem werde ich nicht schlau bzw. hab das mit den JOIN nicht verstanden.)
Also mein SELECT sieht jetzt schon mal so aus:


SELECT * FROM member, memberrank ORDER BY nickname ASC


Vielleicht kann mir ja einer helfen.

Gruß Olly

mwanaheri
28-05-2006, 15:42
hier brauchst du einen einfachen join:


select member.id, member.nickname, member.pb, member.tracker,
memberrank.rank
from member
join memberrank on member.rank = memberrank.id
order by member.nickname;

Das sollte auch bei MySQL gehen.

djaliced
28-05-2006, 15:51
Okay, will das gleich mal ausprobieren.
Kannst du mir das mit dem join mal genauer erklären oder kennst du eine Seite wo das gut erklärt wird? (auch für "dummis")

thx

Edit:

Juhu es klappt, danke.
mein SELECT sieht jetzt so aus:


"SELECT member.ID, member.nickname, member.pbID, member.trackerID, memberrank.rank
FROM member JOIN memberrank ON member.memberrankID = memberrank.ID
ORDER BY member.nickname"


Hatte beim ersten Post die "ID" nach "pb" und "tracker" weggelassen. Weil die ID nichts mit der Datenbank zu tun hat. Damit man es besser lesen kann. So und jetzt werde ich mich mal auf dem Weg machen und weiter suchen, ich will ja aus kappieren warum es jetzt so klappt.;)

mwanaheri
28-05-2006, 21:05
Nun, mal ganz kurz und ungenau:

Nehmen wir mal zwei einfache Tabellen an:
tabA mit id(serial),Name(varchar),Funktion(int mit Fremdschlüssel auf tabB)
tabB mit id(serial), Funktion

Ein join verbindet zwei Tabellen. Die resultierende Tabelle hat alle Spalten der beteiligten Tabellen.

Gibt man kein Kriterium an, nach dem die Tabellen verknüpft werden sollen, so wird jede Zeile der zweiten mit jeder Zeile der ersten Tabelle verknüpft. wenn z.B. beide Tabellen 10 Zeilen haben, so kriegt man 100 Zeilen als Ergebnis.
Gibt man ein Kriterium an, so werden alle Zeilen geholt, die dem Kriterium entsprechen.

jetzt kann es natürlich passieren, dass es in tabA in einigen Zeilen keinen Verweis auf tabB gibt, z.B. weil noch keine Funktion vergeben ist und also
im feld tabA.funktion null steht. Diese Zeilen würde ich so nicht sehen. Wenn ich sie haben will, muss ich einen sog. outer join verwenden, in diesem Falle reicht
left join tabB on...


Die Datenbank macht übrigens auch einen join, wenn du sagst

1) select * from tabA,tabB where tabA.funktion = tabB.id

das liefert dir die selben Ergebnisse wie

2) select * from tabA join tabB on tabA.funktion = tabB.id.

allerdings solltest du dir angewöhnen, einen join immer auch als join zu schreiben. Das ist syntaktisch sauberer und hält dir die where-Klausel frei.
Nimm also die 2. Form.

Als Buchtipp hätte ich "SQL für Dummies".

djaliced
28-05-2006, 22:59
...so langsam kommt die Erleuchtung ;)
ich will den SELECT hier auch noch mal auseinander nehmen, um zu sehen ob ich das jetzt richtig verstanden habe. (in kurzfassung)


"SELECT member.ID,
member.trackerID,
memberrank.rank {<- Die Spaltennamen die selektiert werden sollen}

FROM member JOIN memberrank {<- member ist die "Haupttabelle" und memberrank
ist die Tabelle die in member eingefügt
(verknüpft) werden soll.}

ON member.memberrankID = memberrank.ID" {<- hier steht wie veknüpft werden soll.
"nehme den Datensatz aus memberrank
mit der ID die in memner.memberrankID
steht"}



Ich hoffe mal das ist so einigermaßen richtig.
Ich glaube mit drei Tabellen wird es wohl so ähnlich funktionieren.
Ich werde morgen im besitz eines neuen Büchlein sein ;)
Und nochmals danke für die gute Erklärung und den Buchtip.

P.S.: LEFT JOIN und RIGHT JOIN hab ich geschnallt. :cool:

mwanaheri
28-05-2006, 23:25
Ich hoffe mal das ist so einigermaßen richtig.

Jo, passt.

djaliced
29-05-2006, 14:40
Sorry, aber ich muß hier nochmal rumschleimen :D ;)
Also das mit dem JOIN klappt echt wunderbar. Ich habe jetzt 4 Tabellen miteinander verknüpft und es läuft auf anhieb. ;)


(((Tabelle1 & Tabelle2)-nach-> Tabelle 3)-nach-> Tabelle4)

Danke nochmal:cool:

Gruß Olly