Toon posts:

[SQL] Plaats in de stand selecteren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

ik heb een tabel met deelnemers die een bepaalde score hebben, nu wil ik de deelnemers sorteren op deze score maar er moet ook een kolom komen waarin de plaats staat die ze hebben.

Ik kwam tot deze query:

code:
1
2
3
4
5
SELECT     COUNT(*) AS plaats, T1.gebruikersNaam, T1.score
FROM         Deelnemers AS T1 INNER JOIN
                      Deelnemers AS T2 ON T1.gebruikersNaam <= T2.gebruikersNaam   
GROUP BY T1.gebruikersNaam, T1.score
ORDER BY T1.score DESC


Maar hier laat hij alleen zien de plaats in de tabel (hoeveelste record het is) als hij niet gesorteerd is.
Hoe los ik dit op, want ik wil dit namelijk in een gridview zetten waarbij de eerste kolom dus de plaats in de stand is.

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 10-02 15:26
misschien is het handig om ook de tabel + testdata neer te zetten (een paar regels), en een resultaat van hoe je het wilt hebben. Want zo snap ik er niet veel van, ben ook geen sql expert.

hallo


  • MBV
  • Registratie: Februari 2002
  • Laatst online: 19:10

MBV

Dat los je niet in SQL op, maar in je Business-logic. Waarom moet dat persé in je SQL query? Kan toch ook prima erna, gewoon de gegevens in een for-loopje uitlezen toch :?

  • TheekAzzaBreek
  • Registratie: November 2003
  • Niet online
Als je de ranking niet in je tabel wil bijhouden (en dat is een hoop gedoe) los je dit niet so makkelijk in standaard SQL op. In Oracle kan je een select van een select doen, de binnenste heeft de order by, de buitenste geeft de rangnummertjes (met ROWNUM).

select rownum, * from
(select bla from blabla order by score);

Of mooier met analytical sql: rank over score, maar dat is ook geen standaard. Kijk eens of het voorbeeldje werkt, anders zal je inderdaad met loopjes moeten gaan werken.

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
Verwijderd schreef op vrijdag 08 september 2006 @ 11:07:
code:
1
2
3
4
5
SELECT     COUNT(*) AS plaats, T1.gebruikersNaam, T1.score
FROM         Deelnemers AS T1 INNER JOIN
                      Deelnemers AS T2 ON T1.gebruikersNaam <= T2.gebruikersNaam   
GROUP BY T1.gebruikersNaam, T1.score
ORDER BY T1.score DESC
Dus in plaats van het aantal mensen met een lagere of gelijke gebruikersnaam wil je het aantal mensen met een lagere score? Dat ligt puur aan de join voorwaarde die je gebruikt, als je de join op score zet dan telt ie het aantal mensen met een lagere score.

In dit voorbeeld is een lagere score beter, andersom moet je > ipv < gebruiken en aflopend sorteren.

Ik gebruik LEFT JOIN ipv INNER JOIN en < ipv <= om te zorgen dat wanneer mensen dezelfde score hebben ze op de juiste plaats terecht komen.

MBV: Dit doe je in SQL, zodat je niet altijd alle data hoeft op te halen, en door te lopen in de Business Logic Layer, maar gewoon alleen de data ophaalt uit de database die je wilt zien. Je kunt nu bijvoorbeeld ook WHERE gebruikersNaam = 'Jantje' toevoegen, en meteen de plaats van Jantje zien. Als je het in een andere layer doet, moet je alle data uit de database naar die layer halen, en daar nog eens gaan tellen en sorteren (en waar is een database ook al weer goed in?)
SQL:
1
2
3
4
5
SELECT COUNT(T2.score) +1 AS plaats, T1.gebruikersNaam, T1.score
FROM Deelnemers T1
LEFT JOIN Deelnemers T2 ON T2.score < T1.score
GROUP BY T1.gebruikersNaam, T1.score
ORDER BY T1.score

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 19:10

MBV

nette oplossing van jouw (als het werkt) waar ik niet aan gedacht. Voor het weergeven van de hele tabel (waar ik in eerste instantie aan dacht) lijkt het me jouw oplossing wel weer een stuk trager dan in PHP doen.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 12:34

gorgi_19

Kruimeltjes zijn weer op :9

Mede is het ook afhankelijk welke database je gebruikt.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
bedankt _js_ die query werkt.
Pagina: 1