webForumDet fria alternativet

Sorteringsproblem

26 svar · 742 visningar · startad av Jesper T

Jesper TMedlem sedan nov. 20017 144 inlägg
#1

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?

SebbeMedlem sedan jan. 20032 285 inlägg
#2

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. ;)

LarsGMedlem sedan dec. 200012 464 inlägg
#3

Flyttas från ASP

Jesper TMedlem sedan nov. 20017 144 inlägg
#4

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

LarsGMedlem sedan dec. 200012 464 inlägg
#5

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)
Jesper TMedlem sedan nov. 20017 144 inlägg
#6

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å).

MogMedlem sedan nov. 2003266 inlägg
#7

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.

Jesper TMedlem sedan nov. 20017 144 inlägg
#8

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?

@ndersMedlem sedan juni 200032 969 inlägg
#9

Är id verkligen intressant i sammanhanget?

Jag hade använt endast sort_ordning i wheresatsen.

Jesper TMedlem sedan nov. 20017 144 inlägg
#10

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

Jesper TMedlem sedan nov. 20017 144 inlägg
#11

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
» [red]Mjölk[/red]
Fil
Yogurt
Pastej

Ost
Fil
» [red]Mjölk[/red]
Yogurt
Pastej
MogMedlem sedan nov. 2003266 inlägg
#12

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.

Jesper TMedlem sedan nov. 20017 144 inlägg
#13

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
MogMedlem sedan nov. 2003266 inlägg
#14

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.

Jesper TMedlem sedan nov. 20017 144 inlägg
#15

Härligt! :)

Jesper TMedlem sedan nov. 20017 144 inlägg
#16

...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")
HansenMedlem sedan aug. 2000374 inlägg
#17

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) 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.

LarsGMedlem sedan dec. 200012 464 inlägg
#18

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.

Jesper TMedlem sedan nov. 20017 144 inlägg
#19

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?

HansenMedlem sedan aug. 2000374 inlägg
#20

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 */
[..]
130 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)