Tak jak myślałem, zwykły UPDATE powinien wystarczyć. Możesz do tego napisać procedurę/funkcję.
http://www.microshell.com/database/sql/swap-values-in-2-rows-sql/
W powyższym linku autor korzysta z mysql zamiast mysqli, jeśli chciałbyś użyć tego kodu, to przepisz go na mysqli lub PDO lub jeszcze coś innego aktualnego.
id|col|
--------
1|40
2|20
UPDATE `tbl` SET `col` = 20 WHERE `id` = 1;
UPDATE `tbl` SET `col` = 40 WHERE `id` = 2;
Do takich zastosowań jak sortowanie raczej odradza się korzystanie z tego typu działań (swap) w bazie, ponieważ nie powinno odbywać się to po stronie bazy danych ze względu m.in. na czas odpowiedzi z bazy po np. kliknięciu myszką po stronie clienta, żeby wybrane recordy zostały zamienione miejscami (zaaktualizowane w bazie). Są lepsze rozwiązania moim zdaniem.
Jeśli chcesz, żeby te miejsca recordów zostały zapisane, gdzie jest jaki rekord w pamięci, żeby później móc wyrenderować to w odpowiedniej kolejności, to użyj zwykłych id do tego celu.
body {
white-space: pre;
}
td {
border: 1px solid black;
}
<body style="background: darkgoldenrod;">
<?php
$mysqli = new mysqli('localhost', 'root', 'mystrongpass', 'forumphp');
$x = $mysqli->query('SELECT * FROM `jobers`;');
$ordering = "1
3
2
4";
// something action according from client/server
file_put_contents("new_file_test1.txt", $ordering);
// here can save order id for example in file or database
$arr3 = file('new_file_test1.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$y = ($x->fetch_all());
$arr2 = [];
for($i=0;$i<count($y);$i++) {
$arr2[$arr3[$i]] = [$y[$i][0], $y[$i][1]];
}
ksort($arr2);
echo "<table>";
for($i=1;$i<=sizeof($arr2);$i++) {
echo "<tr><td>".$arr2[$i][0]."</td><td>".$arr2[$i][1]."</td></tr>";
}
echo "</table>";
?>
</body>
Wartość do zmiennej $ordering możesz wygenerować za pomocą JavaScript lub PHP.
select * from jobers;
+--------+--------+
| userid | overid |
+--------+--------+
| 2 | 6 |
| 6 | 18 |
| 9 | 2 |
| 16 | 6 |
+--------+--------+
$ordering = "1
3
2
4";
To oznacza, że na pierwszym miejscu w tabeli (w bazie) ma być record o id=1, później na drugim miejscu record o id=3, następnie na trzecim record o id=2 i na końcu record o id=4. Po posortowaniu, np. tabela wyrenderuje się tak
2 6
9 2
6 18
16 6
Wyciąganie wartości ze zmiennej $ordering wykonałem za pomocą znaków nowej linii, wiec nie możesz napisać tak:
$ordering = "4,2,1,3";
, ponieważ to nie zadziała, chyba że zmodyfikujesz kod, żeby było po przecinku jak w przykładzie powyżej.