myqsl-abfrage mit group ect.

ja man könnte es mit einer temp db lösen :-)

aber das ding hat mein ehrgeiz geweckt *g*
nach einem guten frühstück und ein pott kaffee kam mir die eingebung :-)

melmager prodly presends : the monster sql query *smile*

ich war schon auf dem richtigen weg nur müssen die tabellen anders mit einander verbunden werden:
ein kleines tut wie ich dazu gekommen bin:

select u.name,count(p3)*3 as c3 from spieler as u left join starvote as p3 on u.id=p3.threestar group by u.id

hier wird die usertabelle mit der punktetabelle verbunden (wobei die usertabelle vollständig erhalten bleibt) und wir zählen die einträge mit count (die mal der wertigkeit)
damit hätten wir schon mal die tabelle mit den dreierpunkten
da bei mysql von links nach rechts abgearbeitet wird können wir das ding erweitern :-)
jetzt hauen wir die zweite verküpfung auf das ergebnis:

select u.name,count(p3)*3 as c3,count(p2)*2 as c2 from spieler as u left join starvote as p3 on u.id=p3.threestar left join starvote as p2 on u.id=p2.twostar group by u.id

wir verküpfen das ergebins der ersten joins wieder mit der punktetabelle ...
und weil so schön ist ein drittes mal:

select u.name,count(p3)*3 as c3,count(p2)*2 as c2,count(p1) as c1 from spieler as u left join starvote as p3 on u.id=p3.threestar left join starvote as p2 on u.id=p2.twostar left join starvote as p1 on u.id=p1.onestar group by u.id

damit hätten wir schon mal ein ergebnis :-) das wir nur noch durch eine sortiermaschine schicken müssen:
sprich noch hinten dran:
order by c3 desc,c2 desc,c1 desc

als ergebis hast du dann namen anzahl der 3 punkte; anzahl der 2 punkte und anzahl der einerpunkte und das hübsch sortiert
gesamtpunkte machste dann in php nach der abfrage

$row = mysql_fetch_array();
$gesamt = $row['c3'] + $row['c2'] + $row['c1'];

......
PS: auch was dazugelernt hat :-)
 
Zuletzt bearbeitet:
hmm also hab mal die kleine oben zum anfang genommen und kommt fehler

select u.name,count(p3)*3 as c3 from spieler as u left join starvote as p3 on u.id=p3.threestar group by u.id


des muss glaub ich count(p3.threestar) heissen sonst sagt er not valid argument....


tjo und dann hab ich als ergebnisse aaaaaaallllleeee spieler die in der spielertabelle sind und das sind ne menge...

rechnet sich das dann von der rechenzeit gegenüber meiner 3 fachen query...mal deine in Ehren *g*
 
des muss glaub ich count(p3.threestar) heissen sonst sagt er not valid argument....

stimmt :-)
und die sortierung ist nicht ganz richtig so wie sie jetzt ist ist ein dreier mehr wert wie 2 zweier ...


select u.name,count(p3.threestar) as c3,count(p2.twostar) as c2,count(p1.onestar) as c1,(count(p3.threestar)*3+count(p2.twostar)*2+count(p1.onestar)) as rang from spieler as u left join starvote as p3 on u.id=p3.threestar left join starvote as p2 on u.id=p2.twostar left join starvote as p1 on u.id=p1.onestar group by u.id order by rang desc,c3 desc,c2 desc,c1 desc

so jetzt habe ich es (und auch die summe) *g*

zumindest haste jetzt ein risen sql ding :-)

nachtrag:
achja rechenzeit sollte die gleiche sein ...

was die ausgabe betrifft kannst ja noch ein limit 10 anhängen für die top 10 liste :-)
 
Zuletzt bearbeitet:
schön also du siehst ich mach mir da auch schon meine gedanken dazu *g*

aber muss schon sagen respekt...hätt ich nie so hinbekommen...

du ahnst es sicherlich schon ^^
es gibt da noch ein problem *g*


da dort alle votes reinkommen in starvote und die ausgabe aber monatlich gemacht werden soll muss noch sowas rein...

where month(date)=month(now())

wobei date ein feld in starvote ist...halt der zeitpunkt des votes eines users....

wie muss ich da date joinen damit es funztz...nur p3 oder nur p2 oder nur p1 bringen mir da immer unterschiedliche ergebnisse..

na noch nen Kaffeeee ? *g*
 
wie muss ich da date joinen damit es funztz...nur p3 oder nur p2 oder nur p1 bringen mir da immer unterschiedliche ergebnisse..

alle drei :-) auf das die query länger wird :-) (biste auf ein weltrecord scharf ? *g*)

where month(p1.date)=month(now()) or month(p2.date)=month(now()) or month(p3.date)=month(now())
 
bei deiner temp db muss der join so aussehen:

$res = mysql_query("select s.name,v.plid, sum(v.three*3)+sum(v.two*2)+sum(v.one) as points, sum(v.three) as three, sum(v.two) as two, sum(v.one) as one from vote as v left join spieler as s on s.id=v.plid group by v.plid order by points desc limit 3");

nur mal so :-)

jetzt haste die wahl :-)
 
:-)

ich glaube mehrere SUM() ergebnisse in einem query zu addieren kannste vergessen, Mysql scheint damit "noch" Probleme zu haben ... keine Ahnung woran es liegt, aber das Problem hatten schon viele unter anderem auch ich ;) ... vielleicht ein Bug? (..)

:)
 
Zuletzt bearbeitet:
hmm kann aber bisher da keine Probleme feststellern....

er query'ed perfekt und gibt die richtigen Ergebnisse aus....(selber nachgerechnet *g*)
 
@loki mit den rechenergebnissen von mysql hatte ich noch nie probleme ...

haste da mal ein link oder so?

ich mache jedemenge auswertungen mit php und mysql ..und da sollte ich nachhaken wenn das stimmt...
 
@melmager

danke nochmal für deine Hilfe...
deine sql war sogar im paar ms schneller als meine 3 *g*


wenn du soviel auswertungen mit php und sql machst vielleicht kannst mir ja nochmal bei einem Problem helfen *g*



so gebe ich eine Tabelle aus bei mir (besteht aus 15 teams)

PHP:
$res=mysql_query("select tmptab2.team as id,teams.name as team,sum(games) as cnt,sum(th) as tgh,sum(tg) as tgg,sum(pt) as pts,sum(th-tg) as td from tmptab2 left join teams on tmptab2.team=teams.id group by tmptab2.team order by pts desc,cnt,td desc,tgh desc");

wenn du fragen dazu hast ...kann ich dir jederzeit beantworten *g*


aber so gibt er mir halt die teams aus nach diversen zeugs sortiert...



nu würd ich aber gerne nicht alle teams ausgegeben haben sondern nur

den 1.
.
.
.
platz vor meinem verein (team = 1 = esw)
esw (team = 1 = esw)
platz nach meinem verein (team = 1 =esw)
.
.
.
platz 15.

wobei ja mein team auch 1. und 15. sein könnte (letzteres ist im moment der fall *g*)

also ich glaube das das weniger mit der query zu tun hat als mehr mit der logik des problems....

ich glaub als erstes muss ich mal nur den platz meines teams rausfinden und dann daraufhin weiterarbeiten-....wegen team platz -1 und +1
 
Zurück