/ 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
Ranking system i MySQL
Fra : Thïngmand


Dato : 16-05-01 09:05

Jeg har en tabel der kunne se sådan ud:

ranking navn point
1 Ole 189
2 Lene 164
3 Hans 159
4 Jette 97
5 Thomas 23


Hans har nu fået 10 point mere og skal derfor en ranking op (altså bytte
plads med Lene)

Den eneste løsning jeg er kommet frem til, er at

1. give Hans et midertidigt ranking (eks. 000) og derefter

2. give Lene ranking=ranking+1 og så

3. ændre Hans's ranking til gl.ranking-1

Problemet er at det kræver 3 forespørgsler - nogle der har nogle bedre
forslag der kan klares på færre forespørgsler?






 
 
Christian Laursen (16-05-2001)
Kommentar
Fra : Christian Laursen


Dato : 16-05-01 09:06

"Thïngmand" <michael@thingmand.dk> writes:

> Jeg har en tabel der kunne se sådan ud:
>
> ranking navn point
> 1 Ole 189
> 2 Lene 164
> 3 Hans 159
> 4 Jette 97
> 5 Thomas 23
>
>
> Hans har nu fået 10 point mere og skal derfor en ranking op (altså bytte
> plads med Lene)
>
[snip]
>
> Problemet er at det kræver 3 forespørgsler - nogle der har nogle bedre
> forslag der kan klares på færre forespørgsler?

Drop ranking kolonnen, og lav en select sorteret på point i faldende
rækkefølge, når du skal præsentere resultatet.

--
Med venlig hilsen
Christian Laursen

Thïngmand (16-05-2001)
Kommentar
Fra : Thïngmand


Dato : 16-05-01 12:26

> Drop ranking kolonnen, og lav en select sorteret på point i faldende
> rækkefølge, når du skal præsentere resultatet.

Eksemplet var tænkt - det det skal bruges til er til at bytte sideid på
sider liggende i en database, hvorfor løsningen skal resulterer i det
eksemplet forklarer.

Ellers tak



Jonas Delfs (16-05-2001)
Kommentar
Fra : Jonas Delfs


Dato : 16-05-01 12:31

"Thïngmand" <michael@thingmand.dk> skrev i en meddelelse
news:IrtM6.13268$zv2.1713856@news010.worldonline.dk...
> > Drop ranking kolonnen, og lav en select sorteret på point i faldende
> > rækkefølge, når du skal præsentere resultatet.
>
> Eksemplet var tænkt - det det skal bruges til er til at bytte sideid på
> sider liggende i en database, hvorfor løsningen skal resulterer i det
> eksemplet forklarer.

Hvad med at du lader "ranking" være 'ikke unique', så du kan ha' dubletter?
Så tilføjer du bare feltet "id" som så skal være primær nøgle...

> Ellers tak


--
Mvh. Jonas Delfs
http://delfs.dk



Thïngmand (16-05-2001)
Kommentar
Fra : Thïngmand


Dato : 16-05-01 13:27

> Hvad med at du lader "ranking" være 'ikke unique', så du kan ha'
dubletter?
> Så tilføjer du bare feltet "id" som så skal være primær nøgle...

Det hjælper mig da ikke med at bytte id?

Et eksempel fra den virkelige verden

id subid indhold
1 1 Pærer
1 2 Æbler
1 3 Appelsiner
1 4 Bananer
2 1 Mæk
2 2 Ymer
2 3 Fløde
3 1 Coca-Cola

Når jeg så skal generere en menu tager jeg alle id og når undermenuen skal
laves tager jeg alle subid

Nu vil jeg så flytte Appelsiner op på Æblers plads - de skal altså bytte
subid

- hvordan gøres det bedst?



Kristian Damm Jensen (17-05-2001)
Kommentar
Fra : Kristian Damm Jensen


Dato : 17-05-01 08:45

"Thïngmand" wrote:
>
> Jeg har en tabel der kunne se sådan ud:
>
> ranking navn point
> 1 Ole 189
> 2 Lene 164
> 3 Hans 159
> 4 Jette 97
> 5 Thomas 23
>
> Hans har nu fået 10 point mere og skal derfor en ranking op (altså bytte
> plads med Lene)
>
> Den eneste løsning jeg er kommet frem til, er at
>
> 1. give Hans et midertidigt ranking (eks. 000) og derefter
>
> 2. give Lene ranking=ranking+1 og så
>
> 3. ændre Hans's ranking til gl.ranking-1

Virker ikke. Hvad hvis Hans' ranking skal ændres med mere end én?

> Problemet er at det kræver 3 forespørgsler - nogle der har nogle bedre
> forslag der kan klares på færre forespørgsler?

Mindre end to opdateringer kan ikke gøre det, og som du ser, benytter
jeg en del subselects. Til gengæld er det hermed ligemeget, hvor mange
pladser Hans springer op i placeringen.

update T T2
set point = point + 10
, ranking = (select max(ranking) from T T1 where T1.point < T2.point +
10)
where navn = 'Hans'

update T
set ranking = ranking + 1
where point between (select point from T where navn = 'Hans') - 10
and (select point from T where navn = 'Hans')


Og så kræver løsningen naturligvis, at ranking ikke er unique, men
hvorfor skulle den også være det? Du ændrer vel ikke i din primærnøgle?
--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@capgemini.dk | http://www.thehungersite.com



Thïngmand (21-05-2001)
Kommentar
Fra : Thïngmand


Dato : 21-05-01 08:18

> og som du ser, benytter
> jeg en del subselects.

Hurra: "Re: Ranking system i _MySQL_"


Ellers tak.



Søg
Reklame
Statistik
Spørgsmål : 177517
Tips : 31968
Nyheder : 719565
Indlæg : 6408638
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste