Avatar billede tipsen Nybegynder
11. august 2005 - 22:23 Der er 11 kommentarer

Opdatere tal for sorteringsorden af poster i tabel

Hej alle

Jeg har en tabel, hvor jeg benytter et heltal til at sortere posterne efter når de listes. I forbindelse med ændringer i posternes rækkefølge kan jeg komme ud for den situation, at det tal der sorteres efter vokser og måske kan komme "out of range" på et tidspunkt.

Alle sorteringstallene er forskellige fra hinanden - dvs. hvis jeg har 30 poster, har jeg også 30 forskellige positive heltal til at angive rækkefølgen af posterne, men det er muligt at de eksempelvis ligger i intervallet fra 7-93!

Udover den kode der giver mulighed for at ændre i posternes rækkefølge vil jeg gerne have en kode der går ind og vurderer om posterne skal have ændret sorteringstal og hvis nogle kriterier er opfyldt skal tallenes opdateres til 1, 2, 3, ...

Eksempel:
Jeg har i min tabel 5 poster med sorteringstal: 3, 7, 8, 9, 17 der vurderes som kandidat til opdatering af sorteringtallene og posterne skal dermed opdateres til at have sorteringtallene 1,2,3,4,5 i samme rækkefølge som ovenfor!

Er der en nem/smart måde at lave denne opdatering i MySQL eller skal jeg virkelig ud i noget med først at indlæse alle poster til eks. php og derefter opdatere hver eneste post manuelt efter at have fundet de nye sorteringstal til hver post?

Der må være en smart metode med et enkelt/simpelt update-statement... - men hvordan!?

Håber ovenstående forklaring giver mening og at det er til at forstå min mening.

På forhånd tak.

Mvh Tommy
Avatar billede jaw Nybegynder
11. august 2005 - 22:34 #1
Nedenstående opdaterer alle og starter fra 1 og går op til n.

$q = mysql_query("SELECT felt-med-id FROM tabel ORDER BY felt-med-id ASC") or die(mysql_error());
$i = 1;
while($row = mysql_fetch_array($q)) {
  mysql_query("UPDATE tabel SET `felt-med-id` = $i") or die(mysql_error());
  $i++;
}

Er det hvad du leder efter?
Avatar billede jaw Nybegynder
11. august 2005 - 22:35 #2
Hov, updaten skal lige være:

  mysql_query("UPDATE tabel SET `felt-med-id` = $i WHERE felt-med-id = ".$row['felt-med-id']) or die(mysql_error());
Avatar billede nielle Nybegynder
11. august 2005 - 22:36 #3
Det vil under alle omstændigheder være langt det letteste at lave det i PHP end at forsøge sig i ren SQL. SQL er simpelthen ikke konstrueret med den slags opgaver i tankerne.
Avatar billede nielle Nybegynder
11. august 2005 - 22:40 #4
Koden for at ombytte om på to poster kunne se sådan her ud:

mysql_query("UPDATE dinTabel SET sortering=-1 WHERE sortering=" . sort1);
mysql_query("UPDATE dinTabel SET sortering=" . sort1 . " WHERE sortering=" . sort2);
mysql_query("UPDATE dinTabel SET sortering=" . sort2 . " WHERE sortering=-1");
Avatar billede tipsen Nybegynder
11. august 2005 - 23:15 #5
jaw: Den er pæn nok, men der bliver stadig afviklet lige så mange UPDATE-statements som der er poster i databasen - derfor søger jeg ét simpelt statement, som vil være hurtigere at afvikle! (Jeg har i forvejen en ækvivalent løsning til dét du foreslår!)

nielle: Jeg har allerede lavet koden til flytning af poster - ellers tak for forslaget!
Avatar billede erikjacobsen Ekspert
11. august 2005 - 23:18 #6
Jeg er enig med nielle i at SQL ikke er konstrueret til den slags opgaver. Derfor er det også yderst unaturligt at man godt kan i MySql:

set @nummer=0;
update dintabel set nyorden= ( SELECT @nummer := @nummer + 1 ) order by gammelorden
Avatar billede tipsen Nybegynder
11. august 2005 - 23:58 #7
Erik: Jeg biksede selv lidt rundt med uservariables, men har hverken fået min egen eller din udgave til at fungere :-/ (MySQL 4.0.21-nt)

Din udgave forsøgt tilpasset min problemstilling:
UPDATE tabelnavn SET priority=(SELECT @nytsnr:=@nytsnr+1) WHERE id=1 ORDER by priority ASC

Giver:
#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT @nytsnr:=@nytsnr+1) WHERE id=1 order by priority ASC' at

Derudover har jeg fundet:
http://archives.neohapsis.com/archives/mysql/2005-q2/1756.html

Som jeg heller ikke kan få til at fungere... :-/
Avatar billede erikjacobsen Ekspert
12. august 2005 - 00:02 #8
Prøv mysql 4.1 - det sku' virke der mener jeg (jeg kan altså ikke huske forskel på¨alle versioner)
Avatar billede tipsen Nybegynder
12. august 2005 - 00:07 #9
OK - så må jeg vist bare nøjes med den gammeldags udgave, da jeg er begrænset af en mysql-server, som jeg ikke administrerer.

Tak for kommentarerne til jer alle, hvis I også gider lægge et svar, så kan jeg få afsluttet spørgsmålet og fordele lidt point.
Avatar billede erikjacobsen Ekspert
12. august 2005 - 00:12 #10
Ingen point til mig, tak.

Man kan sikkert også komme til månen i en hestevogn. Selv om du ikke administrerer serveren, kunne du jo godt foreslå en opgradering til noget, som man rent faktisk kan bruge til noget ;)
Avatar billede tipsen Nybegynder
12. august 2005 - 00:23 #11
Det er en mysql-server som bruges til hele SDU (Syddansk Universitet), så der bliver gået med livrem og seler og der skal *meget* til inden der skiftes fra noget (fungerende) gammelt til noget nyt...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester