[mySql]sorteren binnen een limit

Pagina: 1
Acties:

  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 20:16
Hey mensen,

Ik loop tegen een probleem met mySql en ik weet niet hoe ik dit moet oplossen zonder dat ik php gebruik om de gegevens te manipuleren!

Stel ik heb deze tabel:

code:
1
2
3
4
5
6
punten  +     naam
--------------------------------
    10     |    Roel
     4      |    Kees
     3      |    Jan-Peter
     5      |    Pim


Nu gaat het binnen deze resultaten eigenlijk alleen om de top 3 (hoogste punten aantal eerst, laagste punten aantal laatste plaats). Binnen deze top 3 wil ik vervolgens kunnen sorteren op naam. Hoe pak ik dit aan??

Iemand ideeën, via de search vond ik niets, maar dat zal wel zijn omdat ik niet wist hoe dit fenomeen heet!

Alvast bedant

  • Maxxi
  • Registratie: Mei 2004
  • Laatst online: 21-11-2025
SQL-query:
SELECT *
FROM tabel
LIMIT 0 , 30

hierbij is limit vanaf record 0 tot 30

succes

Verwijderd

SELECT * FROM `tabel_naam` ORDER BY `punten` ASC LIMIT 3

Daarmee moet het lukken!

  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
code:
1
2
3
4
5
6
7
8
SELECT top3.*
FROM (
  SELECT *
  FROM table
  ORDER BY punten DESC
  LIMIT 3
  ) top3
ORDER BY top3.naam

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 02-01 15:55
Was net iets soortgelijks als Jochemd hierboven aan t maken ;) , dat is dus de juiste oplossing.

If I can't fix it, it ain't broken.


  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 20:16
Maxxi schreef op donderdag 20 oktober 2005 @ 13:27:
SQL-query:
SELECT *
FROM tabel
LIMIT 0 , 30

hierbij is limit vanaf record 0 tot 30

succes
hehe, dit had ik zelf natuurlijk ook wel kunnen vinden! Beter mijn post lezen ;)
jochemd schreef op donderdag 20 oktober 2005 @ 13:36:
code:
1
2
3
4
5
6
7
8
SELECT top3.*
FROM (
  SELECT *
  FROM table
  ORDER BY punten DESC
  LIMIT 3
  ) top3
ORDER BY top3.naam
ochjah, met een subquery natuurlijk |:(
Dank u hartelijk!

[ Voor 35% gewijzigd door maurad3r op 20-10-2005 13:58 ]


  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 20:16
Nu heb ik nog een vraagje, stel dat ik nu iedere rij door mysql een volgnummer wil meegeven, hoe pak ik dit dan aan?

Dat ik dus van de db terugkrijg:

code:
1
2
3
1      10         Roel
2        5         Pim
3        4         Kees


alvast bedankt!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Beetje omslachtig, maar iets als dit moet dan werken:

SQL:
1
2
3
4
5
6
7
8
9
SET @volgnr=0;
SELECT @volgnr:=@volgnr+1 AS volgnr, top3.*
FROM (
  SELECT *
  FROM table
  ORDER BY punten DESC
  LIMIT 3
  ) top3
ORDER BY top3.naam


Als iemand een betere manier heeft, ik hoor het graag :P

[ Voor 13% gewijzigd door GX op 20-10-2005 14:42 ]


  • Swaptor
  • Registratie: Mei 2003
  • Laatst online: 16-02 22:21

Swaptor

Java Apprentice

Of gewoon in php, terwijl je de gegevens output, een variabele bijhouden en die incrementeel echo-en.
Misschien niet geheel koosjer, maar performancegewijs beter dan de query van GX

Ontdek mij!
Proud NGS member
Stats-mod & forum-dude


Verwijderd

Om te sorteren op punten (van hoog naar laag, descending, en vervolgens op naam (van a tot z, ascending) gebruik je de volgende, simpele query;

code:
1
2
3
4
SELECT *
FROM tabelnaam
ORDER BY punten DESC, naam ASC
LIMIT 0,3


Op deze wijze krijg je drie rijen terug met de hoogste punten en met gesorteerde namen.

[ Voor 4% gewijzigd door Verwijderd op 20-10-2005 15:17 ]


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Nu gaat het maar om 3 records per query dus zal de performance er niet akelig onder lijden.

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 02-01 15:55
Verwijderd schreef op donderdag 20 oktober 2005 @ 15:16:
Om te sorteren op punten (van hoog naar laag, descending, en vervolgens op naam (van a tot z, ascending) gebruik je de volgende, simpele query;

code:
1
2
3
4
SELECT *
FROM tabelnaam
ORDER BY punten DESC, naam ASC
LIMIT 0,3


Op deze wijze krijg je drie rijen terug met de hoogste punten en met gesorteerde namen.
Fout dit is niet wat de TS vroeg. Wat de topicstarter wil is de beste 3 namen op alfabetische volgorde weergeven. Op jou manier worden ze eerst op punten gesorteerd, dat is goed, maar de namen worden alleen gesorteerd als het aantal punten gelijk is en dat is niet de bedoeling.

If I can't fix it, it ain't broken.


  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
*edit*

TS niet grondig genoeg gelezen 8)7 :X

*edit2*
Borizz schreef op donderdag 20 oktober 2005 @ 15:19:
[...]
Fout dit is niet wat de TS vroeg. Wat de topicstarter wil is de beste 3 namen op alfabetische volgorde weergeven. Op jou manier worden ze eerst op punten gesorteerd, dat is goed, maar de namen worden alleen gesorteerd als het aantal punten gelijk is en dat is niet de bedoeling.
Wat is daar het verschil dan tussen? TS wil toch de persoon met meeste punten bovenaan, in het geval die gelijk zijn moet er op naam gesorteerd worden. Kan toch perfect zonder subquery niet?

[ Voor 180% gewijzigd door Blacksnak op 20-10-2005 15:25 ]


Verwijderd

Borizz schreef op donderdag 20 oktober 2005 @ 15:19:
[...]


Fout dit is niet wat de TS vroeg. Wat de topicstarter wil is de beste 3 namen op alfabetische volgorde weergeven. Op jou manier worden ze eerst op punten gesorteerd, dat is goed, maar de namen worden alleen gesorteerd als het aantal punten gelijk is en dat is niet de bedoeling.
Misschien moet Borizz beter lezen wat er staat?
Ik lees toch echt, en ik citeer, `punten aantal eerst, laagste punten aantal laatste plaats` en een stukje verderop lees ik `...wil ik vervolgens kunnen sorteren op naam` waarbij ik aanneem dat `vervolgens` aangeeft dat er in tweede instantie pas op naam gesorteerd moet worden. En dat is precies wat mijn query doet.

Oftewel, er moet een keuze gemaakt worden. Wat wil je eerst? Van hoog naar laag qua punten? En vervolgens pas op naam? Of wil je drie rijen selecteren met de hoogste punten en vervolgens die rijen weer gaan sorteren op naam, ongeacht wat dit voor gevolgen heeft op de volgorde van die drie rijen? Iets wat tot gevolg heeft dat iemand met minder punten bóven iemand kan staan met meer punten. Nogmaals, er moet een keuze gemaakt worden. En ik begreep zoals ik hierboven uitleg uit de TS dat de punten belangrijker zijn dan de namen, en dan is mijn query perfect.

Als ik er naast zit, mag de TS wat beter leren formuleren ;)

[ Voor 3% gewijzigd door Verwijderd op 20-10-2005 15:34 ]


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Hij formuleert het wat onhandig, maar hij wil de beste 3 gesorteerd op naam, althans, dat is mijn interpretatie.

  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
GX schreef op donderdag 20 oktober 2005 @ 15:58:
Hij formuleert het wat onhandig, maar hij wil de beste 3 gesorteerd op naam, althans, dat is mijn interpretatie.
Komt dat dan niet overeen met sorteren op punten en daarna op naam?

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 02-01 15:55
Verwijderd schreef op donderdag 20 oktober 2005 @ 15:33:
[...]


Misschien moet Borizz beter lezen wat er staat?
Ik lees toch echt, en ik citeer, `punten aantal eerst, laagste punten aantal laatste plaats` en een stukje verderop lees ik `...wil ik vervolgens kunnen sorteren op naam` waarbij ik aanneem dat `vervolgens` aangeeft dat er in tweede instantie pas op naam gesorteerd moet worden. En dat is precies wat mijn query doet.

Oftewel, er moet een keuze gemaakt worden. Wat wil je eerst? Van hoog naar laag qua punten? En vervolgens pas op naam? Of wil je drie rijen selecteren met de hoogste punten en vervolgens die rijen weer gaan sorteren op naam, ongeacht wat dit voor gevolgen heeft op de volgorde van die drie rijen? Iets wat tot gevolg heeft dat iemand met minder punten bóven iemand kan staan met meer punten. Nogmaals, er moet een keuze gemaakt worden. En ik begreep zoals ik hierboven uitleg uit de TS dat de punten belangrijker zijn dan de namen, en dan is mijn query perfect.

Als ik er naast zit, mag de TS wat beter leren formuleren ;)
Ik quote even uit de TS:
Nu gaat het binnen deze resultaten eigenlijk alleen om de top 3 (hoogste punten aantal eerst, laagste punten aantal laatste plaats). Binnen deze top 3 wil ik vervolgens kunnen sorteren op naam. Hoe pak ik dit aan??
Het had wat beter omschreven mogen worden inderdaad dus we hebben allebei gelijk :) .
Blacksnak schreef op donderdag 20 oktober 2005 @ 15:59:
[...]

Komt dat dan niet overeen met sorteren op punten en daarna op naam?
Ja maar dat is wat anders dan dat je in MySQL doet met ORDER BY punten DESC, naam ASC. Die sorteert namelijk eerst op punten en bij gelijke punten gaat ie op naam sorteren.

If I can't fix it, it ain't broken.


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Blacksnak schreef op donderdag 20 oktober 2005 @ 15:59:
[...]


Komt dat dan niet overeen met sorteren op punten en daarna op naam?
Wat ik zei, nee.

Maar het is wel mijn leesfout; zie boven

  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
Borizz schreef op donderdag 20 oktober 2005 @ 16:03:
Ja maar dat is wat anders dan dat je in MySQL doet met ORDER BY punten DESC, naam ASC. Die sorteert namelijk eerst op punten en bij gelijke punten gaat ie op naam sorteren.
Dat weet ik ja, dat hij eerst op punten sorteert en bij gelijke punten op naam. Maar wat ik niet goed doorheb is welk verschil dit geeft (kan geven) in een uiteindelijk resultaat?

Je kan toch maar sorteren op punten OF op naam (allé, kbedoel dat je toch altijd een hoofditem hebt waarop gesorteerd wordt?) Ga je, zonder eerste sortering te behouden, sorteren op andere item wordt die vorige toch opgeheven? Of sla ik het nu compleet mis?


*edit*
Howla, m'n euro is gevallen :)

Is inderdaad niet hetzelfde. Kzag even over het hoofd dat de 2de sortering enkel ging over de overgebleven 3 ipv weeral hele reeks.

* Blacksnak is terug wakker nu ;)

[ Voor 13% gewijzigd door Blacksnak op 20-10-2005 16:10 ]


  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 20:16
GX schreef op donderdag 20 oktober 2005 @ 14:40:
Beetje omslachtig, maar iets als dit moet dan werken:

SQL:
1
2
3
4
5
6
7
8
9
SET @volgnr=0;
SELECT @volgnr:=@volgnr+1 AS volgnr, top3.*
FROM (
  SELECT *
  FROM table
  ORDER BY punten DESC
  LIMIT 3
  ) top3
ORDER BY top3.naam


Als iemand een betere manier heeft, ik hoor het graag :P
IK heb het nog niet getest, doe ik morgen..
Maar dit is precies wat ik bedoelde!, nu is het echter nutteloos om de buitenste select een volgnummer mee te geven, het ging eigenlijk om de binnenste: zodat NA sortering de positie
gewaarborgt blijft! Maar hiermee zal het me wel lukken! Erg bedankt en sorry voor de problemen met mijn start post :Y)

code:
1
2
3
4
5
6
7
8
9
SET @volgnr=0;
SELECT top3.*
FROM (
  SELECT @volgnr:=@volgnr+1 AS volgnr, naam
  FROM table
  ORDER BY punten DESC
  LIMIT 3
  ) top3
ORDER BY top3.naam
Pagina: 1