[(My)SQL] Positie in resultaat opvragen

Pagina: 1
Acties:

  • Martijn02
  • Registratie: September 2000
  • Laatst online: 09-09 11:37

Martijn02

/* No Comment */

Topicstarter
Ik ben bezig met een site, en daarop staan verschillende items, en op die items kan je voten. cijfers van -3 tot +3 geven, dit verhoogt en verlaagt een tellertje.

Nou wil ik graag bij het weergeven van het item de plaats in de ranglijst weergeven. Het ophalen van de hele lijst gaat zo...
pseudo sql:
code:
1
2
3
4
SELECT *
FROM Item
WHERE typeID = 16
ORDER BY votesTotal DESC

en dan kijken op welke plaats het record in de result staat. Lijkt me een beetje omslachtig... ik zoek naar een operator voor mysql waarmee je de locatie in de reult kan opvragen ofzo
code:
1
2
3
4
5
SELECT position(*)
FROM Item
WHERE typeID = 16
AND ID = 234
ORDER BY votesTotal DESC

en dat je dan de positie in het result terug krijgt...

Wie weet er of zoiets bestaat, of een andere manier om het op te lossen ?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Volgens mij druist je verlangen een beetje tegen de bedoeling van een database in :)

In oracle kan je dit (heel lelijk) oplossen door naar de RowNum te kijken, maar ik gok dat je beter een andere oplossing kan bedenken.

Geef eens wat duidelijker aan waar je die positie voor nodig hebt?

Wil je, als iemand zegt "ding met id 15" weten op welke positie die is gekomen in de ranglijst?

  • Martijn02
  • Registratie: September 2000
  • Laatst online: 09-09 11:37

Martijn02

/* No Comment */

Topicstarter
Nee... mischien is het niet helemaal duidelijk geworden.

Het gaat om een ranglijst. Alle items hebben een votesTotal, en als ik daar op sorteer krijg je een top 40. (wel even "LIMIT 1, 40" toevoegen :))

Maar als ik nou doorklik naar een van de items in de top 40 wil ik op die pagina zien op welke plaats in de top 40 het ding staat.

Snap je nu wat ik bedoel?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op vrijdag 08 februari 2002 13:32 schreef Martijn02 het volgende:
Maar als ik nou doorklik naar een van de items in de top 40 wil ik op die pagina zien op welke plaats in de top 40 het ding staat.

Snap je nu wat ik bedoel?
Dat zei ik toch? :)

Magoed, eerlijk gezegd weet ik niet goed hoe je dat op kan lossen met simpele queries.

Hooguit door steeds, na elke wijziging, alle posities opnieuw door te rekenen en die vervolgens up te daten in de DB.

Verwijderd

Je zou het zo kunnen doen:

Om de positie van een item te bepalen wil je eigenlijk weten hoeveel andere items er zijn met een lager cijfer!
De volgende query doet dat (tenminste in Oracle)
code:
1
2
3
select i1.ID
,   (select count(*) from Item i2 where i2.cijfer < i1.cijfer)
from   Item i1

Ik weet echter niet of dit helemaal het gewenste resultaat oplevert als er veel items zijn met hetzelfde cijfer.

Verwijderd

Nog eens even wat geprobeert en de volgende query doet het ook goed als er items zijn met hetzelfde cijfer. Hij count alleen maar het aantal unieke cijfers.
code:
1
2
3
select i1.ID
,   (select count(distinct cijfer) from Item i2 where i2.cijfer < i1.cijfer)
from   Item i1

Dit betekent wel dat items met hetzelfde cijfer ook op dezelfde positie komen. M.a.w. je kan dan b.v. meerdere items op nr 1 hebben staan omdat ze hetzelfde cijfer hebben.

  • Martijn02
  • Registratie: September 2000
  • Laatst online: 09-09 11:37

Martijn02

/* No Comment */

Topicstarter
Hmmm, het uitrekenen van het aantal items met een hogere notering is inderdaad een goeie oplossing... MySQL kent geen sub-selects, maar dat lossen we wel op... Met een count(*D
code:
1
2
3
4
SELECT count(*)
FROM Item
WHERE typeID = 16
  AND votesTotal > $item->votesTotal

Stom dat het zo simpel is, zo had ik nog niet tegen het probleem aangekeken. en inderdaad kan je zo wel een gedeelde 2e plaats hebben, maar dat moet dan maar...

Verwijderd

Kweet niet waar in je site werkt (php waarschijnlijk?, maar volgens mij kan je het probleem ook wel zonder query oplossen.
als je nou je results op je pagina tovert en een tellertje laat meelopen, dan krijg je zoiets:

teller=0;
// voer je query uit om alle titels op te halen
JE_QUERY()
while (er results zijn){
print naam_van_je_result_als_link_met_teller_als_variabele; teller++;
}


je href is dan zoiets: volgendepagina.php?plaats=teller

vergeef me als dit totaal niet is wat je bedoeld :)

  • Martijn02
  • Registratie: September 2000
  • Laatst online: 09-09 11:37

Martijn02

/* No Comment */

Topicstarter
heb ik ook aan gedacht, maar als je op een andere manier bij een item terecht komt, (via de category listing) dan wil je ook de plaats kunnen zien... en dan kan je het niet meegeven met de link.
Pagina: 1