/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Distinct lignende ting
Fra : Michael Jensen


Dato : 06-11-03 07:50

Hejsa

Jeg har følgende tabel:
-------------------------------
| id | name | country | value |
-------------------------------
| 1 | Per | dk | 100 |
| 2 | Tom | es | 80 |
| 3 | Gert | dk | 90 |
| 4 | Finn | dk | 95 |
| 5 | Juan | po | 70 |
-------------------------------

Nu vil jeg så gerne vælge top 3 ud fra value, men med den betingelse af der
max må være 2 fra hvert land!

Dvs. at resultatet skal være .

1 Per dk
2 Finn dk
3 Tom es

Kan dette lade sig gøre med ren SQL?

Dette finder jo de 3 danskere:
SELECT name, value, country FROM scores ORDER BY value DESC LIMIT 0,3

Mens :
SELECT name, value, DISTINCT(country) FROM scores ORDER BY value DESC LIMIT
0,3

vel tager en dansker, en spanier og en portugiser

Nogen der har en løsning?

--
Med venlig hilsen

Michael Jensen
Michael[SNABEL]ogj[PRIK]DK



 
 
Michael Zedeler (09-11-2003)
Kommentar
Fra : Michael Zedeler


Dato : 09-11-03 15:07

Michael Jensen wrote:
> Hejsa
>
> Jeg har følgende tabel:
> -------------------------------
> | id | name | country | value |
> -------------------------------
> | 1 | Per | dk | 100 |
> | 2 | Tom | es | 80 |
> | 3 | Gert | dk | 90 |
> | 4 | Finn | dk | 95 |
> | 5 | Juan | po | 70 |
> -------------------------------
>
> Nu vil jeg så gerne vælge top 3 ud fra value, men med den betingelse af der
> max må være 2 fra hvert land!
>
> Dvs. at resultatet skal være .
>
> 1 Per dk
> 2 Finn dk
> 3 Tom es
>
> Kan dette lade sig gøre med ren SQL?
>
> Dette finder jo de 3 danskere:
> SELECT name, value, country FROM scores ORDER BY value DESC LIMIT 0,3
>
> Mens :
> SELECT name, value, DISTINCT(country) FROM scores ORDER BY value DESC LIMIT
> 0,3
>
> vel tager en dansker, en spanier og en portugiser
>
> Nogen der har en løsning?

Det eneste jeg kan komme på er at lave et left join på tabellen selv.
Prøv at kigge lidt på HAVING-udtrykket. Det er det,d er skal bruges hvis
det overhovedet skal kunne lade sig gøre. Det er ikke pænt og sikkert
fyldt med fejl:

SELECT tabel1.name, tabel2.name, tabel1.value, tabel2.value,
MAX(tabel1.value), MAX(tabel2.value)
FROM tabel AS tabel1, tabel AS tabel2
WHERE tabel1.country += tabel2.country AND tabel1.value > tabel2.value
GROUP BY tabel1.name, tabel2.name
HAVING tabel1.value = MAX(tabel1.value) AND tabel2.value = MAX(tabel2.value)

Ellers kan du også bare gøre det med nogle subselects.

M.


Michael Jensen (10-11-2003)
Kommentar
Fra : Michael Jensen


Dato : 10-11-03 07:38

Michael Zedeler wrote:
> Det eneste jeg kan komme på er at lave et left join på tabellen selv.
> Prøv at kigge lidt på HAVING-udtrykket. Det er det,d er skal bruges
> hvis det overhovedet skal kunne lade sig gøre. Det er ikke pænt og
> sikkert
> fyldt med fejl:
>
> SELECT tabel1.name, tabel2.name, tabel1.value, tabel2.value,
> MAX(tabel1.value), MAX(tabel2.value)
> FROM tabel AS tabel1, tabel AS tabel2
> WHERE tabel1.country += tabel2.country AND tabel1.value > tabel2.value
> GROUP BY tabel1.name, tabel2.name
> HAVING tabel1.value = MAX(tabel1.value) AND tabel2.value =
> MAX(tabel2.value)

Min nuværende løsning er at hente lidt ekstra personer i via SQL også lave
ordne det via ret simpel PHP.

Jeg tror jeg fortsætter med denne løsning hvis der ikke lige findes en mere
elegant en i SQL


--
Med venlig hilsen

Michael Jensen
Michael[SNABEL]ogj[PRIK]DK



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste