|
| flyt op/ned (MySQL) Fra : Martin Højriis Krist~ |
Dato : 04-05-02 09:28 |
|
Hej alle
Jeg har en liste (links) på en webside.
Brugerne skal kunne tilpasse denne, bla. ved at ændre på rækkefølgen af
disse.
I tabellen er der et position-felt, som jeg sorterer på ved udtræk.
Når brugeren skal flytte et link (her link2) en plads op skal man i
princippet udføre
link;position
link1;1 -> link1;2
link2;2 -> link2;1
Men det bliver værre. For det første er ikke alle positionerne brugt
(hvis fx et link er blevet slettet) og får det andet sorteres først på
en type (underindeling). Brugeren kan også flytte links fra type til
type..
Dvs hvis vi gentager forsøget (her med link5)
link;position;type
link2;1;type2 -> link2;5;type2
link3;3;type1
link4;4;type1
link5;5;type2 -> link5;1;type2
Stadig en relativt overskuelig ting, men så kommer det udfordrende:
Hvordan får man det ned på så få sætninger som muligt?
--
Martin Højriis Kristensen - http://www.makr.dk/?usenet
http://www.harrys-kaelder.dk/ - Nu med ulødigt content
Jeg repræsenterer med dette indlæg mig selv og ikke TDC Internet
| |
Christian Doeleman (07-05-2002)
| Kommentar Fra : Christian Doeleman |
Dato : 07-05-02 07:20 |
|
"Martin Højriis Kristensen" <usenet@makr.dk> skrev:
> Jeg har en liste (links) på en webside.
> Brugerne skal kunne tilpasse denne, bla. ved at ændre på rækkefølgen af
> disse.
> I tabellen er der et position-felt, som jeg sorterer på ved udtræk.
> Stadig en relativt overskuelig ting, men så kommer det udfordrende:
> Hvordan får man det ned på så få sætninger som muligt?
Er der ingen, der kan hjælpe Martin?
Jeg vil også meget gerne se en løsning, da jeg gerne ville lave en outliner
som denne: http://216.73.30.100/todo/
--
Med venlig hilsen
Christian
| |
Nis Jorgensen (07-05-2002)
| Kommentar Fra : Nis Jorgensen |
Dato : 07-05-02 08:44 |
|
On Sat, 4 May 2002 10:27:38 +0200, "Martin Højriis Kristensen"
<usenet@makr.dk> wrote:
>
>Jeg har en liste (links) på en webside.
>Brugerne skal kunne tilpasse denne, bla. ved at ændre på rækkefølgen af
>disse.
>I tabellen er der et position-felt, som jeg sorterer på ved udtræk.
>
>Når brugeren skal flytte et link (her link2) en plads op skal man i
>princippet udføre
>link;position
>link1;1 -> link1;2
>link2;2 -> link2;1
>
>Men det bliver værre. For det første er ikke alle positionerne brugt
>(hvis fx et link er blevet slettet) og får det andet sorteres først på
>en type (underindeling). Brugeren kan også flytte links fra type til
>type..
>
>Dvs hvis vi gentager forsøget (her med link5)
>link;position;type
>link2;1;type2 -> link2;5;type2
>link3;3;type1
>link4;4;type1
>link5;5;type2 -> link5;1;type2
>
>Stadig en relativt overskuelig ting, men så kommer det udfordrende:
>Hvordan får man det ned på så få sætninger som muligt?
Det kan goeres i et hug - med forbehold for mySQLs begraenseninger mht
sunqueries. Men jeg tror ikke maalet skal vaere at begraense antallet
af saetninger. Her er et bud paa hvordan det kan goeres
Antag at vi vil flytte link1 fra typeX posX til typeY posY. Saa kan vi
fx goere saaledes (i noget der minder om SQL 92 - er ikke sikker paa
om mySQL har CASE, men ellers har den sikkert noget der ligner
UPDATE myTable
SET type =
CASE
WHEN (link = :link1) then :typeY
ELSE type
END,
pos =
CASE
WHEN (link = :link1) THEN :posY
WHEN (type = :typeX AND pos > :posX) THEN pos - 1
WHEN (type = :typeY and pos >= :posY) THEN pos + 1
ELSE pos
END
Det kan vaere at du kan optimere ovenstaaende ved at smide en
WHERE-betingelse ind, saaledes at den kun arbejder med raekker der
opfylder mindst en af betingelserne. Proev det!
--
Nis Jorgensen
Amsterdam
Please include only relevant quotes, and reply below the quoted text. Thanks
| |
Jakob Andersen (07-05-2002)
| Kommentar Fra : Jakob Andersen |
Dato : 07-05-02 08:47 |
|
"Nis Jorgensen" <nis@dkik.dk> skrev i en meddelelse
news:qj0fdu8nefavpkpi2edri28ejmindtenp2@4ax.com...
> Det kan goeres i et hug - med forbehold for mySQLs begraenseninger mht
> sunqueries.
Det er nu en skam at der ikke er flere databaser der understøtter sunqueries
--
Jakob Andersen
| |
Jens Gyldenkærne Cla~ (07-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 07-05-02 09:13 |
|
"Jakob Andersen" <jakob@effectus.dk> skrev:
>> Det kan goeres i et hug - med forbehold for mySQLs
>> begraenseninger mht sunqueries.
>
> Det er nu en skam at der ikke er flere databaser der
> understøtter sunqueries
Understøtter mySQL cursors? Det kan nemlig også klare jobbet -
eventuelt, men ikke nødvendigvis, sammen med en trigger.
--
Jens
| |
Nis Jorgensen (07-05-2002)
| Kommentar Fra : Nis Jorgensen |
Dato : 07-05-02 09:43 |
|
On Tue, 7 May 2002 08:12:40 +0000 (UTC), "Jens Gyldenkærne Clausen"
<jc@dmf.dk> wrote:
>"Jakob Andersen" <jakob@effectus.dk> skrev:
>
>>> Det kan goeres i et hug - med forbehold for mySQLs
>>> begraenseninger mht sunqueries.
>>
>> Det er nu en skam at der ikke er flere databaser der
>> understøtter sunqueries
>
>Understøtter mySQL cursors? Det kan nemlig også klare jobbet -
>eventuelt, men ikke nødvendigvis, sammen med en trigger.
1) Jeg mener ikke mySQL understoetter triggers i noget der ligner
brugbar grad.
2) Cursors er med garanti understoettet - men kraever jo et imperativt
sprog at blive behandlet i. SQL _boer_ vaere hurtigere.
--
Nis Jorgensen
Amsterdam
Please include only relevant quotes, and reply below the quoted text. Thanks
| |
Jens Gyldenkærne Cla~ (07-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 07-05-02 10:12 |
|
Nis Jorgensen <nis@dkik.dk> skrev:
> 2) Cursors er med garanti understoettet - men kraever jo et
> imperativt sprog at blive behandlet i.
Ikke forstået. I MS SQL er cursorsyntaksen da direkte indbygget i
T-SQL.
> SQL _boer_ vaere hurtigere.
Cursors er sjældent det hurtigste valg - men nogle gange er det
det eneste valg.
Jeg kan ikke gennemskue hvad kolonerne gør i dit forslag ("WHEN
(link = :link1) then :typeY" etc.) - men de er ikke genkendt i T-
SQL så jeg tvivler på at det er helt std. SQL 92.
Generelt arbejder en UPDATE-sætning (SVJV) på et sæt mens en
cursor arbejder rækkevis. Jeg kender ikke nogen måde hvor man kan
vedligeholde en fortløbende nummerrække med en enkelt UPDATE-
query.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
| |
Nis Jorgensen (07-05-2002)
| Kommentar Fra : Nis Jorgensen |
Dato : 07-05-02 13:35 |
|
On Tue, 7 May 2002 09:11:53 +0000 (UTC), "Jens Gyldenkærne Clausen"
<jc@dmf.dk> wrote:
>Nis Jorgensen <nis@dkik.dk> skrev:
>
>> 2) Cursors er med garanti understoettet - men kraever jo et
>> imperativt sprog at blive behandlet i.
>
>Ikke forstået. I MS SQL er cursorsyntaksen da direkte indbygget i
>T-SQL.
T-SQL er saa vidt jeg kan bedoemme et imperativt sprog. Det har
variabeltildeling og loops - i modsaetning til standard SQL.
>> SQL _boer_ vaere hurtigere.
>
>Cursors er sjældent det hurtigste valg - men nogle gange er det
>det eneste valg.
Og i disse tilfaelde ogsaa hurtigere
Jeg er ikke af princip modstander af imperative sprog - men
foretraekker SQL naar det kan lade sig goere. Det er ogsa
>Jeg kan ikke gennemskue hvad kolonerne gør i dit forslag ("WHEN
>(link = :link1) then :typeY" etc.) - men de er ikke genkendt i T-
>SQL så jeg tvivler på at det er helt std. SQL 92.
Det er min notation af parametre i SQL-kaldet. Hvis du erstatter
:link1 med [link1] osv skulle det virke fint i MSSQL
>Generelt arbejder en UPDATE-sætning (SVJV) på et sæt mens en
>cursor arbejder rækkevis. Jeg kender ikke nogen måde hvor man kan
>vedligeholde en fortløbende nummerrække med en enkelt UPDATE-
>query.
Jeg har da lige demonstreret en metode?
--
Nis Jorgensen
Amsterdam
Please include only relevant quotes, and reply below the quoted text. Thanks
| |
Jens Gyldenkærne Cla~ (07-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 07-05-02 14:03 |
|
Nis Jorgensen <nis@dkik.dk> skrev:
> T-SQL er saa vidt jeg kan bedoemme et imperativt sprog. Det
> har variabeltildeling og loops - i modsaetning til standard
> SQL.
Jo - men med hensyn til hastighed forestiller jeg mig at der er
forskel på en ekstern adgang (som f.eks. en ADO-cursor) og så en
Cursor defineret i selve SQL-delen. Selv om T-SQL skulle være
imperativt betyder det vel næppe at standard SQL-forespørgsler
behandles langsommere her end i et andet (ikke-imperativt) sprog.
> Det er min notation af parametre i SQL-kaldet.
Beklager - men jeg er stadig ikke med. Findes der både et link og
et link1-felt? Så vidt jeg kan læse det oprindelige spørgsmål er
der tre felter: link, position og type.
> Hvis du erstatter :link1 med [link1] osv skulle det virke fint
> i MSSQL
Det gør det ikke. Der spørges efter kolonnen link1 etc.
> Jeg har da lige demonstreret en metode?
Som jeg stadig ikke har set virke. Jeg vil ikke afvise at det kan
lade sig gøre - men jeg vil meget gerne have et fungerende
eksempel.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
| |
Nis Jorgensen (07-05-2002)
| Kommentar Fra : Nis Jorgensen |
Dato : 07-05-02 14:48 |
|
On Tue, 7 May 2002 13:03:12 +0000 (UTC), "Jens Gyldenkærne Clausen"
<jc@dmf.dk> wrote:
>
>> Det er min notation af parametre i SQL-kaldet.
>
>Beklager - men jeg er stadig ikke med. Findes der både et link og
>et link1-felt? Så vidt jeg kan læse det oprindelige spørgsmål er
>der tre felter: link, position og type.
Vi gentager lige mit indlaeg:
Antag at vi vil flytte link1 fra typeX posX til typeY posY. Saa kan vi
fx goere saaledes (i noget der minder om SQL 92 - er ikke sikker paa
om mySQL har CASE, men ellers har den sikkert noget der ligner
UPDATE myTable
SET type =
CASE
WHEN (link = :link1) then :typeY
ELSE type
END,
pos =
CASE
WHEN (link = :link1) THEN :posY
WHEN (type = :typeX AND pos > :posX) THEN pos - 1
WHEN (type = :typeY and pos >= :posY) THEN pos + 1
ELSE pos
END;
Som du vil se har vi nogle givne oplysninger - vi ønsker at flytte
link1 fra typeX, posX til typeY, posY. Disse formodes at være
defineret som variable i den kaldende kode - og ønskes overført til
vores SQL-saetning. Alt afhaengigt af vaertssproget er der forskellige
maader at gøre det paa:
I php lader det til at folk indsaetter "$variabel", og lader
streng-substitution klare arbejdet. I DAO (og formodentlig tilsvarende
i ADO) ville man lave et Querydef/Command-objekt med "[parameternavn]"
i SQL'en, og tildele vaerdier til Parameters-kollektionen for dette
objekt. I Delphi virker det paa naesten samme maade, bortset fra at
man bruger ":parameternavn" (som ovenfor). ODBC bruger en lignende
syntax.
--
Nis Jorgensen
Amsterdam
Please include only relevant quotes, and reply below the quoted text. Thanks
| |
Jens Gyldenkærne Cla~ (07-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 07-05-02 15:54 |
|
Nis Jorgensen <nis@dkik.dk> skrev:
> Vi gentager lige mit indlaeg:
>
> Antag at vi vil flytte link1 fra typeX posX til typeY posY.
Her faldt en tiøre. Men du skal stadig køre en UPDATE-sætning pr.
ændring.
Hvis man bare bytter pladser kan man klare sig med 2 UPDATE's pr.
gang, men hvis man sletter et link midt i rækken kan det være mange
opdateringer der skal fyres af. Det kan måske nok gøres uden en
cursor, men jeg tror hverken det er enklere eller hurtigere.
Hvis man ikke vil bekymre sig om huller i rækken er det formentlig
nemmere. Så kan man bytte to pladser (med 2 x UPDATE), mens indsæt
foregår enten øverst eller nederst. Bortset fra at man risikerer at
løbe ind i datatypeproblemer [1] skulle det være en enkel og hurtig
løsning.
"Min" udgave - som jeg bl.a. bruger i et færdigt system - er en
cursor der løber posterne igennem i den rigtige rækkefølge
(sorteret efter positionsfeltet) og "lapper huller" ved at fyre
UPDATE's af når der er behov for det. Den er ikke optimeret, men
jeg behøver også kun at bruge den en gang imellem. Jeg har til
gengæld "luft" mellem mine positionstal - 10, 20, 30, ... i stedet
for 1, 2, 3. På den måde kan jeg lave flere rokeringer uden at
skulle ændre alle værdierne.
1) En normal int skulle være rigeligt til de fleste formål, men
omvendt er det også lidt frås hvis man kun har brug for tal fra
f.eks. 0-256.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
| |
Nis Jorgensen (07-05-2002)
| Kommentar Fra : Nis Jorgensen |
Dato : 07-05-02 19:02 |
|
On Tue, 7 May 2002 14:54:12 +0000 (UTC), "Jens Gyldenkærne Clausen"
<jc@dmf.dk> wrote:
>Nis Jorgensen <nis@dkik.dk> skrev:
>
>> Vi gentager lige mit indlaeg:
>>
>> Antag at vi vil flytte link1 fra typeX posX til typeY posY.
>
>Her faldt en tiøre. Men du skal stadig køre en UPDATE-sætning pr.
>ændring.
Nej. Min query laver alle de aendringer der er noedvendige for at
flytte en post fra en type til en anden.
>Hvis man bare bytter pladser kan man klare sig med 2 UPDATE's pr.
>gang,
Nej, en er nok. Brug skemaet fra den query jeg postede
> men hvis man sletter et link midt i rækken kan det være mange
>opdateringer der skal fyres af.
Nej, en er nok. Brug skemaet fra den query jeg postede.
>Det kan måske nok gøres uden en
>cursor, men jeg tror hverken det er enklere eller hurtigere.
En hvilken som helst loesning der bruger cursors er i hvert fald
svaerere at flytte til en anden platform (med mindre du bruger
client-side cursors).
b
--
Nis Jorgensen
Amsterdam
Please include only relevant quotes, and reply below the quoted text. Thanks
| |
Jens Gyldenkærne Cla~ (13-05-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 13-05-02 11:08 |
|
Nis Jorgensen <nis@dkik.dk> skrev:
>>Her faldt en tiøre. Men du skal stadig køre en UPDATE-sætning
>>pr. ændring.
>
> Nej. Min query laver alle de aendringer der er noedvendige for
> at flytte en post fra en type til en anden.
O.k. Jeg ville enormt gerne se et fungerende eksempel i SQL-
server, men jeg har ikke tid til at forsøge mig frem lige nu.
Hvis du kan/vil/orker at lave et må du meget gerne, men jeg
forstår godt hvis du ikke gider.
> En hvilken som helst loesning der bruger cursors er i hvert
> fald svaerere at flytte til en anden platform (med mindre du
> bruger client-side cursors).
Ja.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
| |
Nis Jorgensen (13-05-2002)
| Kommentar Fra : Nis Jorgensen |
Dato : 13-05-02 13:22 |
|
On Mon, 13 May 2002 10:07:58 +0000 (UTC), "Jens Gyldenkærne Clausen"
<jc@dmf.dk> wrote:
>Nis Jorgensen <nis@dkik.dk> skrev:
>
>>>Her faldt en tiøre. Men du skal stadig køre en UPDATE-sætning
>>>pr. ændring.
>>
>> Nej. Min query laver alle de aendringer der er noedvendige for
>> at flytte en post fra en type til en anden.
>
>O.k. Jeg ville enormt gerne se et fungerende eksempel i SQL-
>server, men jeg har ikke tid til at forsøge mig frem lige nu.
>Hvis du kan/vil/orker at lave et må du meget gerne, men jeg
>forstår godt hvis du ikke gider.
Det er ikke rigtigt et spoergsmaal om gidelse - men jeg har ikke
SQL-server ved haanden. Jeg kan dog nemt modificere mit eksempel til
at virke i Access - mit indtryk er at JET-SQL naesten er en delmaengde
af TSQL.
Nedenstaaende virker, bortset fra primaernoegledefinitionen ...
CREATE TABLE myTable
(link TEXT, type TEXT, pos integer,
CONSTRAINT PrimaryKey PRIMARY KEY (type,pos) )
INSERT INTO myTable VALUES ('TestLink1', 'TestType1',1);
INSERT INTO myTable VALUES ('TestLink2', 'TestType1',2);
INSERT INTO myTable VALUES ('TestLink3', 'TestType1',3);
INSERT INTO myTable VALUES ('TestLink4', 'TestType2',1);
INSERT INTO myTable VALUES ('TestLink5', 'TestType2',2);
UPDATE myTable SET myTable.type =
IIf(link='TestLink2','TestType2',type), myTable.pos =
Switch(link='TestLink2',2,type='TestType1' And
pos>2,pos-1,type='TestType2' And pos>=2,pos+1,True,pos);
--
Nis Jorgensen
Amsterdam
Please include only relevant quotes, and reply below the quoted text. Thanks
| |
|
|