[MySQL]Unieke groepering op 2 velden query

Pagina: 1
Acties:

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 21-02 18:50

DDemolition

slopen is mijn lust en leven

Topicstarter
Aanschouw hier mijn 2 tabellen voor de score geschiedenis voor m'n wk 2006 pool. De rest van de tabellen zal ik maar achterwegen laten want die zijn niet belangrijk.
Afbeeldingslocatie: http://rene.dekkers.biz/Plaatjes/user-userscores.JPG

tblusers:
Gegevens van de gebruikers

tbluserscores
Scoregeschiedenis per dag, per gebruiker. Hierin staat dus hoeveelste de gebruiker gisteren was en wat toen zijn score was. Dit is een bult redundantie, maar deze tabel is onvermijdelijk om een goede scoregeschiedenis snel uit te draaien.

Query:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SELECT
    DISTINCT(USR_ID),
    USR_Nickname,
    USR_Name,
    USR_Midname,
    USR_Surname,
    USC_Position,
    USC_OldPosition,
    USC_OldScore,
    USC_TodayScore,
    USC_Score,
    USC_TodayPosition,
    UNIX_TIMESTAMP(USC_Date) AS aDate
FROM
    tblusers
INNER JOIN
    tbluserscores
ON
    tblusers.USR_ID = tbluserscores.USC_UsersID
WHERE
    USC_Type = 'Poolgroup'
AND
    USR_PoolgroupID = '3'
AND
    USR_Visible = '1'
GROUP BY
    USR_ID
ORDER BY
    USC_Position,
    USC_TodayScore


Wat moet de query (eigenlijk) doen:
De scores ophalen van de laatste speeldag gesorteerd op USC_Position vervolgens USC_TodayScore. Elke gebruiker mag maar 1x in het rijtje voorkomen.

Wat krijg ik nu:
Verschillende speeldagen en scores door elkaar.

Ik heb al flink liggen rommelen met MAX(), DISTINCT() en GROUP BY er tussen te zetten, maar kom er nu niet meer uit.
De distinct en group by declaraties zullen vast niet goed zijn.
Als ik MAX(UNIX_TIMESTAMP(USC_Date)) AS aDate doe krijg ik de goede datum, maar toch de oude scores.

Om alle scores in 7 nested query's te draaien vind ik 'n beetje vies. Ook kan ik er alles wel op php niveau eruit filteren, maar ik vind dat een query het goede terug moet parsen.
Ik hoop dat het een beetje duidelijk is...

[ Voor 10% gewijzigd door DDemolition op 02-05-2006 19:37 ]

Specs: Server, WS boven, WS beneden


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
Alle scores van de laatste speeldag zeg, je dus dat gaat in de WHERE clausule.
De volgorde geef je ook aan, dat gaat dus in de ORDER BY clausule.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    *
FROM 
    tblusers 
INNER JOIN 
    tbluserscores 
ON 
    tblusers.USR_ID = tbluserscores.USC_UsersID 
WHERE
    USC_Date = (SELECT MAX(USC_Date) FROM tbluserscores)
ORDER BY 
    USC_Position, 
    USC_TodayScore

Mocht je MySQL geen subquery's ondersteunen omdat het te oud is, dan doe je het in twee queries, je vraagt eerst de max datum op, en vult die direct in in het WHERE gedeelte.

  • DDemolition
  • Registratie: Augustus 2003
  • Laatst online: 21-02 18:50

DDemolition

slopen is mijn lust en leven

Topicstarter
Bedankt!
Hij werkt perfect. Eigenlijk is de oplossing te simpel om er een topic voor te openen nu ik het zo zie 8)7 . Als je moeilijk gaat zitten denken, bak je er meestal niet veel meer van...
Ik werk trouwens met MySQL 5.0.20, dus nested query's pikt hij gewoon.

[ Voor 8% gewijzigd door DDemolition op 03-05-2006 10:14 ]

Specs: Server, WS boven, WS beneden