[MySQL & PHP] 3 Tables miteinander verknüpfen!

ChristianK

Well-known member
ID: 85965
L
25 Mai 2006
92
1
Hi!

bin grad am programmieren, jedoch komme ich nicht weiter, weil ich 3 Tables miteinander verknüpfen muss.
Es soll eine Art-Rangliste für ein OnlineSpiel entstehen. Die User Rangliste habe ich nun fertig, jedoch die Allianz Rangliste bekomme ich nicht hin.

Erst mal die 3 Tables mit ihren benötigten Feldern:

allianzen
-> id
-> name

festungen
-> mitglied_id
-> punkte

mitglieder
-> id
-> name
-> allianz


Festungen->mitglied_id und mitglieder->id hängen zusammen. Unter Festungen können mehre Einträge für einen User da sein.

Also, unter allianzen allianzen->name und allianzen->id auslesen, über die allianzen->id auf mitglieder->allianz gehen über die mitglieder->id, unter Festungen->mitglied_id alle Einträge zusammen suchen und punkte addieren.

Nun alle Allianzen mit Mitglieder Zahl und Punkten ausgeben!

Hoffe habe es ein bisschen verständlich beschrieben. Glaube man muss dazu Joins verwenden, jedoch habe ich davon 0 Ahnung. :(


Christian
 
ungetestet...
Code:
SELECT SUM(festungen.punkte), allianzen.name FROM allianzen, festungen, mitglieder WHERE mitglieder.allianz = allianzen.id AND mitglieder.id = festungen.mitglied_id GROUP BY allianz.id
 
ChristianK schrieb:
allianzen
-> id
-> name

festungen
-> mitglied_id
-> punkte

mitglieder
-> id
-> name
-> allianz


Festungen->mitglied_id und mitglieder->id hängen zusammen. Unter Festungen können mehre Einträge für einen User da sein.

Also, unter allianzen allianzen->name und allianzen->id auslesen, über die allianzen->id auf mitglieder->allianz gehen über die mitglieder->id, unter Festungen->mitglied_id alle Einträge zusammen suchen und punkte addieren.

Nun alle Allianzen mit Mitglieder Zahl und Punkten ausgeben!
PHP:
SELECT a.id AS id, a.name AS name, COUNT(m.id) AS mitglieder, SUM(f.punkte) AS punkte FROM allianzen a LEFT JOIN mitglieder m ON m.allianz=a.id LEFT JOIN festungen f ON f.mitglied_id=m.id GROUP BY a.id
Getestet

Bei Bedarf kannste noch ganz am Ende ein ORDER BY hinzufügen, z.b.
PHP:
ORDER BY punkte DESC
Mist, Burnred war schneller :mrgreen:
 
Danke an euch!

Jedoch beim ersten Code kam ein Fehler, habe ihn bearbeitet zu:

SELECT SUM( festungen.punkte ) , allianzen.name
FROM allianzen, festungen, mitglieder
WHERE mitglieder.allianz = allianzen.id
AND mitglieder.id = festungen.mitglied_id
GROUP BY allianzen.id

Es geht, jedoch werden nicht die Mitglieder angegeben.

Beim anderen Code geht das rechnen gut, jedoch stimmen die Mitglieder nicht überein. Wahrscheinlich werden Sie von Festungen statt von Mitglieder gezählt?
 
Nice ;)

Es geht jetzt wunderbar!!!

SELECT a.id AS id, a.name AS name, COUNT( DISTINCT m.id ) AS mitglieder, SUM( f.punkte ) AS punkte
FROM allianzen a
LEFT JOIN mitglieder m ON m.allianz = a.id
LEFT JOIN festungen f ON f.mitglied_id = m.id
GROUP BY a.id
ORDER BY punkte DESC



Woran hat es denn jetzt gelegen?


Vielen Dank an euch alle ;)


PS:

Kann man noch sagen, das die Allianzen mit 0 Mitgliedern nicht angezeigt werden sollen? Mal eine Frage, warum macht MySQL bei Punkten, sehr lange Nachkommastellen??

5 fbcb 1 62.7200021743774
3 noob 1 27.6200008392334
1 SpecialForce 0 NULL
4 fhfh 0 NULL
 
lass mal das group by weg dann siehste an was das leigt... du erhällst zu jeder festung das mitglied und die allianz. hat ein mitglied zwei festungen dann bekommst du auch 2 datensätze... und mit distinct gehst du dem aus dem weg, da mysql dann doppelte einträge ignoriert und nur einmal zählt.

zu zweitens... ersetz einfachmal das erste LEFT JOIN gegen ein INNER JOIN.

und das mit den kommastellen ist normal... das leigt daran wie kommazahlen gespeichert werden. entweder du stellst den spalten typ auf decimal um oder du rundest bei der ausgabe... ROUND(SUM( f.punkte ))