---
title: "Sorteringsproblem"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/98805-sorteringsproblem"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Jesper T"
published: "2004-03-05T18:56:09.000Z"
updated: "2004-03-10T18:41:50.000Z"
replies: 26
views: 786
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/98805-sorteringsproblem"
---

# Sorteringsproblem

_Sida 1 av 2._

## #1 — Jesper T, 2004-03-05T18:56Z

Låt säga att jag har en kolumn som heter sort_ordning och en som heter matvaror

```
matvaror  |   sort_ordning
--------------------------------
fil             2
yogurt          1
mjölk           3
--------------------------------
```

Om jag nu vill flytta ner yogurt "ett steg". Hur gör man då, utan att behöva ändra alla tre poster?
Eller är det fel databasstruktur?

Permalänk: https://www.webforum.nu/p/98805

## #2 — Sebbe, 2004-03-05T18:59Z

Kanske såhär?

```
UPDATE tabell SET sort_ordning = sort_ordning + 1 WHERE sort_ordning >= 1
```

**/red** När jag tänker på det kanske det inte var riktigt så du menade, men säg bara till. ;)

Permalänk: https://www.webforum.nu/p/1293049

## #3 — LarsG, 2004-03-05T19:03Z

Flyttas från ASP

Permalänk: https://www.webforum.nu/p/1293052

## #4 — Jesper T, 2004-03-05T19:11Z

Det enda som händer är att alla posters sort_ordning plusas på med ett. (1) ... :(

Jag vill att det skall bli så här: 
fil 
mjölk            
yogurt

Permalänk: https://www.webforum.nu/p/1293057

## #5 — LarsG, 2004-03-05T19:16Z

Just för detta fall.

```
update t set sort_ordering = case when sort_ordering = 1 then 2 else 1 end 
where sort_ordering in (1,2)
```

Permalänk: https://www.webforum.nu/p/1293060

## #6 — Jesper T, 2004-03-07T10:31Z

Fattar inte riktigt.
Låt säga att det är en lång lista på ex. tjugo poster. Då är föjldaktligen varje post numrerad ifrån 1 till 20. 
Så: Varje post för sig skulle jag vilja kunna flytta upp och ner i listan. (Ändra sortering på).

Permalänk: https://www.webforum.nu/p/1293622

## #7 — Mog, 2004-03-07T10:53Z

En variant.

Flytta upp

```
SQLstr = "UPDATE sort_ordning SET id = 0 WHERE id = " & sid
"kör frågan"
SQLstr = "UPDATE tabell SET sort_ordning = " & sid & " WHERE sort_ordning = " & sid-1
"kör frågan"
SQLstr = "UPDATE tabell SET sort_ordning = " & sid-1 & " WHERE sort_ordning = 0"
"kör frågan"
```

Flytta ner

```
SQLstr = "UPDATE tabell SET sort_ordning = 0 WHERE sort_ordning = " & sid
"kör frågan"
SQLstr = "UPDATE tabell SET sort_ordning = " & sid & " WHERE sort_ordning = " & sid+1
"kör frågan"
SQLstr = "UPDATE tabell SET sort_ordning = " & sid+1 & " WHERE sort_ordning = 0"
"kör frågan"
```

Om detta är bra eller rätt vet jag inte, med det funkar.

Permalänk: https://www.webforum.nu/p/1293628

## #8 — Jesper T, 2004-03-08T08:32Z

Nja, jag får inte detta att rulla. "Flytta upp" och "Flytta ner" ser ju olika ut. 
Och om id:t i detta fall är 72 så kommer 72 att hamna i  kolumnen "sort_ordering", eller?

Permalänk: https://www.webforum.nu/p/1294000

## #9 — @nders, 2004-03-08T08:48Z

Är id verkligen intressant i sammanhanget?

Jag hade använt endast sort_ordning i wheresatsen.

Permalänk: https://www.webforum.nu/p/1294005

## #10 — Jesper T, 2004-03-08T08:51Z

Nej det kanske inte är det... Hur skulle det se ut då, då?

Permalänk: https://www.webforum.nu/p/1294009

## #11 — Jesper T, 2004-03-08T09:04Z

Men, men... om mjölk i detta fall skall ploppa ner ett hack, så måste man väl dra in lite annat än sorteringsordning, eller?

```
Ost
&raquo; [red]Mjölk[/red]
Fil
Yogurt
Pastej

Ost
Fil
&raquo; [red]Mjölk[/red]
Yogurt
Pastej
```

Permalänk: https://www.webforum.nu/p/1294013

## #12 — Mog, 2004-03-08T10:47Z

När du plockar ut från tabellen kör du antagligen en "Order By  sort_ordning", eller ?

Om mjölk har 2 och ska flyttas upp så sätter jag först mjölks id (sort_ordning) till 0

```
SQLstr = "UPDATE sort_ordning SET id = 0 WHERE id = " & sid
```

 Sedan sätter jag posten ovanför (sort_ordning = 1) till mjölks gamla id (2)

```
SQLstr = "UPDATE tabell SET sort_ordning = " & sid & " WHERE sort_ordning = " & sid-1
```

Sist sätter vi mjölk, som nu har id 0, till sitt nya id (1)

```
SQLstr = "UPDATE tabell SET sort_ordning = " & sid-1 & " WHERE sort_ordning = 0"
```

Mjölk har nu flyttats upp.

Permalänk: https://www.webforum.nu/p/1294054

## #13 — Jesper T, 2004-03-08T10:50Z

> När du plockar ut från tabellen kör du antagligen en "Order By sort_ordning", eller ?

 Japp.
Men sort_ordning är ju en kolumn inte en tabell 

```
SQLstr = "UPDATE [b]sort_ordning[/b] SET id = 0 WHERE id = " & sid
```

Permalänk: https://www.webforum.nu/p/1294056

## #14 — Mog, 2004-03-08T10:55Z

Helt rätt, det är jag som har skrivit fel :r 

```
SQLstr = "UPDATE tabellen SET sort_ordning = 0 WHERE sort_ordning = " & sid
```

 
Så ska det väl vara.

Permalänk: https://www.webforum.nu/p/1294061

## #15 — Jesper T, 2004-03-08T10:59Z

Härligt! :)

Permalänk: https://www.webforum.nu/p/1294063

## #16 — Jesper T, 2004-03-08T15:55Z

...dock finns det en nackdel om man flyttar ner en post mer än "i botten". 

**RED./ Jag fick kolla hur många poster det fanns först, då funkade det bättre. 
Dock så kanske fyra sql-satser är lite mycket för att åstakomma detta. 
Men har ingen annan något smartare tips så får det bli så.** 
Jag bifogar koden för intresserade.

```
	Dim connection
		Set Connection = Server.CreateObject("ADODB.Connection")
		Connection.Open ("Provider=MySQLProv;Data Source=********;User Id=*******;Password=**********;")
		
		Dim oid : oid = trim(replace(Request.querystring("oid")," ",""))
		Dim pid : pid = trim(replace(Request.querystring("pid")," ",""))
		Dim dir : dir = trim(replace(Request.querystring("dir")," ",""))
		
		if dir = "up" then
			
				Connection.execute("UPDATE tbl_links SET orderid = 0 WHERE orderid = "& oid &" AND parent_page_id="& pid),,128
				Connection.execute("UPDATE tbl_links SET orderid = "& oid &" WHERE orderid = " & oid-1 &" AND parent_page_id="& pid),,128
				Connection.execute("UPDATE tbl_links SET orderid = "& oid-1 &" WHERE orderid = 0 AND parent_page_id="& pid),,128
		else
		Dim countid, countno
	   			Set countid = Connection.execute("SELECT COUNT(orderid) FROM tbl_links WHERE parent_page_id="& pid)
				If Not countid.BOF Or Not countid.EOF Then
				countno=countid(0)
				end if
				countid.close : set countid = nothing
					if cInt(countno) > cInt(oid) then
						Connection.execute("UPDATE tbl_links SET orderid = 0 WHERE orderid = "& oid &" AND parent_page_id="& pid),,128
						Connection.execute("UPDATE tbl_links SET orderid = "& oid &" WHERE orderid = " & oid+1 &" AND parent_page_id="& pid),,128
						Connection.execute("UPDATE tbl_links SET orderid = "& oid+1 &" WHERE orderid = 0 AND parent_page_id="& pid),,128
					end if
		end if
		
		connection.close : set connection=nothing
		'Response.write countno
		Response.Redirect Request.ServerVariables("HTTP_REFERER")
```

Permalänk: https://www.webforum.nu/p/1294244

## #17 — Hansen, 2004-03-08T21:36Z

Testa med detta:

```
UPDATE tbl_links AS t1,
       tbl_links AS t2
   SET t2.orderid = CASE
                      WHEN t2.orderid = t1.orderid THEN t1.orderid + 1
                      ELSE t1.orderid
                    END
 WHERE t1.parent_page_id = 123
   AND t2.orderid BETWEEN t1.orderid AND t1.orderid + 1
```

Har du ett unikt index på orderid så kommer det **inte** att fungera!

**Uppdatering 2004-03-09 16:22**

Givetvis har LarsG rätt! (har han någonsin fel? ;)  I Jespers förra inlägg ([Count i sql](http://www.webforum.nu/showthread.php?threadid=96854)) så skriver han att han använder MySQL, påståendet ovan är tyvärr korrekt för MySQL.

Detta har bitit mig några gånger, jag postar en notis MySQL forumet.

Permalänk: https://www.webforum.nu/p/1294414

## #18 — LarsG, 2004-03-09T08:40Z

> Har du ett unikt index på orderid så kommer det inte att fungera!

Jo, det skall fungera. Unikheten skall kontrolleras när alla rader uppdaterats, inte för varje enskild rad.

Permalänk: https://www.webforum.nu/p/1294506

## #19 — Jesper T, 2004-03-09T13:28Z

> **Hansen skrev:**
>
> Testa med detta:
> 
>
>
> ```
> UPDATE tbl_links AS t1,
>        tbl_links AS t2
>    SET t2.orderid = CASE
>                       WHEN t2.orderid = t1.orderid THEN t1.orderid + 1
>                       ELSE t1.orderid
>                     END
>  WHERE t1.parent_page_id = 123
>    AND t2.orderid BETWEEN t1.orderid AND t1.orderid + 1
> ```
>
> 
> 
> Har du ett unikt index på orderid så kommer det **inte** att fungera!

Tack, men jag får det inte att funka. Hur hade du tänkt hur det skulle se ut tillsammans med den koden jag bifogade?

Permalänk: https://www.webforum.nu/p/1294650

## #20 — Hansen, 2004-03-09T15:45Z

> **Jesper T skrev:**
>
> \[..\] jag får det inte att funka

Får du några felmeddelanden?

> **Jesper T skrev:**
>
> Hur hade du tänkt hur det skulle se ut tillsammans med den koden jag bifogade?

Jag och VB går tyvärr inte ihop ;)

```
[..]
 WHERE t1.parent_page_id = 123 /* <- id för sidan du vill flytta höger/ner */
[..]
```

Permalänk: https://www.webforum.nu/p/1294739

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/98805-sorteringsproblem  
Nästa sida: https://www.webforum.nu/amne/databaser-sql/98805-sorteringsproblem/page2.md
