myqsl-abfrage mit group ect.

HammerHe@rt

Erfahrenes Mitglied
ich habe eine vote tabelle wo die votes eines users eingetragen werden

ich hab 20 spieler zur auswahl, wobei der user 3, 2 und 1 punkt vergeben kann...also sich 3 unterschiedliche spieler raussuchen kann

in der tabelle gibs die spalten id, threepoint, twopoint, onepoint, ip, date

die spieler werden mit ihrer id aus der spielerdatenbank eingetragen..

so das in threepoint, twopoint und onepoint nur zahlen drinn stehen


wie muss nun die Abfrage lauten damit ich folgendes Ergebniss ausgeben kann

XX Votes

1. Spielername XX Punkte (gesamt) davon xx mal 3Pkt, xx mal 2Pkt, xx mal 1 Pkt.
2. -""-
3. -""-


kann mir wer da helfen?


hab bisher da leider noch kein ansatzpunkt, tu mir da immer bischen schwer bei so verschachtelten abfragen
 
spielerdb und punktedb müssen per join verbunden werden

select s.name,sum(p.threepoint) as three,sum(p.twopoint) as two,sum(p.onepoint) as one,(three+two+one) as rang
from spieler as s left join punkte as p on p.id=s.id group by s.id order by rang desc

ich hoffe ist richtig denke mal ja :)
 
Zuletzt bearbeitet:
hmm nee da bekomm ich Fehlermeldung zurück...not suplied argument

ich denk auch nicht das das mit einer query gehen wird...

der Fehler liegt glaub ich irgendwo beim join

..... on p.id=s.id group by s.id


p.id (also id in der Punktetabelle)
die hat ja nix mit den Spielern an sich zu tun bzw den Namen...die ID's der Spieler stehen ja in threepoint, twopoit und onepoint drinne...

so das ein vote in der db so aussieht

ID - threepoint - twopoit - onepoint - ip - date
-------------------------------------------------
1 - 212 - 145 - 342 - xxx - xxx



also der bezug zum namen müsste dann auf threepoint/twopoint/onepoint liegen , was ja sicher nicht gehen wird....

am besten wär vielleicht ne abfrage das ich erstmal die punkte hab der besten 3 und dann kann ich ja mit ner 2. den namen abfragen durch die id
 
imo hab ich selber so gelöst.....

PHP:
<?
mysql_query("create temporary table vote (plid int not null,three int not null,two int not null,one int not null)");
mysql_query("insert into vote (plid,three) SELECT threestar, count(*) FROM `starvote` group by threestar");
mysql_query("insert into vote (plid,two) SELECT twostar, count(*) FROM `starvote` group by twostar");
mysql_query("insert into vote (plid,one) SELECT onestar, count(*) FROM `starvote` group by onestar");
$res = mysql_query("select plid, sum(three*3)+sum(two*2)+sum(one) as points, sum(three) as three, sum(two) as two, sum(one) as one from vote group by plid order by points desc limit 3");
?>


mir fehlt halt noch in der letzten query der left join zur tabelle spieler mit der spalte namen...
vielleicht kannste mir da helfen


oder du hast noch ne Idee wie ich das mit der temp.Tabelle umgehen kann...was ich aber nicht glaube *g*
 
schon klar :)

aber ich bin einfach mal davon ausgegangen das deine spielerdb so aufgebaut ist:

id name ...

edit klar kann man die temp db umgehen
durch join :)
 
Zuletzt bearbeitet:
jo Spielerdatenbank is so aufgebaut....


ID name .....

12 Harald




also wo is dann der Fehler in deiner Query.....


weil du joints auf p.id

das geht doch aber nicht...da, da die id ja nur die id des eindeutigen votedatensatzes ist...und die spielerids in threepoints, twopooints und onepoint stehen...also auf was willste da joinen ? *g*


lass mich gerne belehren..also nur zu....
 
so das ein vote in der db so aussieht

ID - threepoint - twopoit - onepoint - ip - date
-------------------------------------------------
1 - 212 - 145 - 342 - xxx - xxx


ok das ist die tabelle starvote ...

wie sieht denn deine user tabelle aus?
 
ok lassen wir mal die punkte aussen vor
verbinden wir mal diespielerdb und die starvote tabelle:

select * from starvote left join spieler on spieler.id=starvote.id

damit werden die beiden tabellen über die gemeinsame id verbunden

dann kürzen wir mal:

select * from starvote as v left join spieler as s on s.id=v.id

dann machen wir mal die summen:

select *.s,sum(v.onevote) from starvote as v left join spieler as s on s.id=v.id
 
Zuletzt bearbeitet:
usertabelle gibts nicht...es können nur die voten die noch nicht mit ihrer ip in der tabelle stehn...

letzlich soll nur folgendes rauskommen bei der Abfrage aus Tabelle starvote

1.Spielername xx Punkte (2x3pkt/1x2pkt/0x0Pkt.)
2. gleiche
3. gleiche




dazu muss man wie du schon bemerktest auf die Spielertabelle joinen um die Zahlen 212, 145, 342 (siehe letztes Bsp.) in die richtigen Namen "umzuwandeln".....

Spielerdatenbank sieht so aus......

ID - Name - rest
212 - Paul
145 - Hans
342 - Erna



so...auf was willste denn jetzt die spieler.id in der tabelle starvote joinen ?
 
nein da liegt dein denkfehler im ansatz !!!

select * from starvote left join spieler on spieler.id=starvote.id


starvote.id hat absolut nix mit der spieler.id zu tun

die spieler id's stehen in der Tabelle Starvote in den spalten threepoint, twopoint, onepoint...

die id in starvote ist nur die normale datensatzid für einen vote

verstanden? *g*
 

Neue Beiträge

Zurück