Jesper TMedlem sedan nov. 20017 144 inlägg 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 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. ;)
Jesper TMedlem sedan nov. 20017 144 inlägg 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 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 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 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 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 Är id verkligen intressant i sammanhanget?
Jag hade använt endast sort_ordning i wheresatsen.
Jesper TMedlem sedan nov. 20017 144 inlägg Nej det kanske inte är det... Hur skulle det se ut då, då?
Jesper TMedlem sedan nov. 20017 144 inlägg 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 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
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 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 ...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 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
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
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
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 */
[..]