sql query uitdaging
ik heb even een semi gevordere vraag waar ik nu al een tijdje mee zit.
$query = "
SELECT *, MAX(aantalPunten), UNIX_TIMESTAMP(datumPlayed) AS datumPlayed
FROM $spelerTabel
WHERE DAY(datumPlayed) != DAY(NOW())
GROUP BY DAY(datumPlayed)
ORDER BY datumPlayed DESC";
hierbij wil ik de speler selecteren met de maximale score van vandaag. (bij simulaire scores wil ik de gene die het eerst gespeeld heeft selecteren)
Op dit moment krijg ik $%^$ de laagste! Maar sowieso gebruik ik MAX, GROUP BY en ORDER BY niet correct volgens mij.
Iemand raad?
Hier wat links binnen 1 seconde gevonden op google:
http://www.techonthenet.com/sql/max.php
http://www.techonthenet.com/sql/group_by.php
http://www.w3schools.com/sql/sql_orderby.asp
veel succes, ik ga nu maar eens naar school
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
naam,
max( aantalPunten ) AS hoogste,
DATE_FORMAT( datumPlayed, '%Y-%m-%d' ) AS speeldag,
DATE_FORMAT( datumPlayed, '%H:%i:%s' ) AS speeltijd
FROM
spelers
GROUP BY
naam,
max( aantalPunten ) AS hoogste,
DATE_FORMAT( datumPlayed, '%Y-%m-%d' ) AS speeldag,
DATE_FORMAT( datumPlayed, '%H:%i:%s' ) AS speeltijd
ORDER BY
datumPlayed ASC
naam,
max( aantalPunten ) AS hoogste,
DATE_FORMAT( datumPlayed, '%Y-%m-%d' ) AS speeldag,
DATE_FORMAT( datumPlayed, '%H:%i:%s' ) AS speeltijd
FROM
spelers
GROUP BY
naam,
max( aantalPunten ) AS hoogste,
DATE_FORMAT( datumPlayed, '%Y-%m-%d' ) AS speeldag,
DATE_FORMAT( datumPlayed, '%H:%i:%s' ) AS speeltijd
ORDER BY
datumPlayed ASC
Altijd groeperen op alles wat je in je select vraagt
Klaasjan Boven schreef op 02.11.2006 12:37:
Altijd groeperen op alles wat je in je select vraagt
Waarom?
Als je alleen op naam wilt groeperen, is GROUP BY naam genoeg hoor.
Misschien even uitleggen waarom je zo stellig roept dat je altijd op alles moet groeperen?
(Volgens mijn Oracle SQL boek, hoeft dat niet altijd)
ik wil elke dag dat er gespeeld is BEHALVE vandaag kijken wie de beste was qua aantalPunten (bij gelijke punten word er gesorteerd op datumPlayed)
SELECT
spelerId,
naam,
day( datumplayed ) ,
max( aantalpunten )
FROM
spelertabel
WHERE
DAY( datumPlayed ) != DAY( NOW( ) )
AND aantalpunten !=0
GROUP BY
DAY( datumPlayed )
ORDER BY
DAY( datumplayed ) DESC
Dit werkte vrij ver goed. Ik krijg een de MAX(aantalPunten) wel door maar naam en spelerId is NIET gelinkt aan die MAX(aantalPunten). Dus ik krijg de verkeerde naam en ID door.
Daarnaast vrees ik voor problemen als ik datums krijg zoals 2 oktober en 2 november aangezien dan DAY() het zelfde is.
iemand suggesties?
sorry voor de verkeerd geformuleerde vraag van eerder en bedankt voor de replies zover!
GROUP BY
DATE_FORMAT(datumPlayed)
als ik dit vervang door
GROUP BY
datumPlayed
Is dat weg. Maar ik blijf het zelfde probleem houden.
Ik krijg een de MAX(aantalPunten) wel door maar naam en spelerId is NIET gelinkt aan die MAX(aantalPunten). Dus ik krijg de verkeerde naam en ID door.
iemand een idee?
bedankt!
niemand dit probleem ooit hoeven tackelen?
Robert schreef op 02.11.2006 12:41:
Waarom?
Als je alleen op naam wilt groeperen, is GROUP BY naam genoeg hoor.
Misschien even uitleggen waarom je zo stellig roept dat je altijd op alles moet groeperen?
(Volgens mijn Oracle SQL boek, hoeft dat niet altijd)
Klaasjan Boven schreef op 02.11.2006 12:37:
Altijd groeperen op alles wat je in je select vraagt
Waarom?
Als je alleen op naam wilt groeperen, is GROUP BY naam genoeg hoor.
Misschien even uitleggen waarom je zo stellig roept dat je altijd op alles moet groeperen?
(Volgens mijn Oracle SQL boek, hoeft dat niet altijd)
@Robert, een fout van mij je hebt helemaal gelijk sorry
@TS
Das raar, want volgens mij moet bovengenoemde code gewoon werken. Maargoed, denk niet dat dit werkt, maar proberen kan je altijd he:)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
naam,
MAX( aantalPunten ) AS hoogste,
DATE_FORMAT( datumPlayed, '%Y-%m-%d' ) AS speeldag,
DATE_FORMAT( datumPlayed, '%H:%i:%s' ) AS speeltijd
FROM
spelers
WHERE
DATE(datumPlayed) != CURDATE()
AND
aantalPunten = hoogste
GROUP BY
DATE_FORMAT(datumPlayed, '%Y-%m-%d')
ORDER BY
datumPlayed ASC
naam,
MAX( aantalPunten ) AS hoogste,
DATE_FORMAT( datumPlayed, '%Y-%m-%d' ) AS speeldag,
DATE_FORMAT( datumPlayed, '%H:%i:%s' ) AS speeltijd
FROM
spelers
WHERE
DATE(datumPlayed) != CURDATE()
AND
aantalPunten = hoogste
GROUP BY
DATE_FORMAT(datumPlayed, '%Y-%m-%d')
ORDER BY
datumPlayed ASC
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
ben nu aan het roberen met een subquery erin. nog geen succes helaas.....
@ Robert: in jouw voorbeeld ben je bij GROUP BY het tweede argument voor DATE_FORMAT vergeten.
Jan Koehoorn schreef op 09.11.2006 23:14:
@ Robert: in jouw voorbeeld ben je bij GROUP BY het tweede argument voor DATE_FORMAT vergeten.
Goed opgemerkt, zal het aanpassen ;)