• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przenoszenie w dół / górę rekordów sql

Konkurs Mistrz Programowania
0 głosów
688 wizyt
pytanie zadane 1 lipca 2019 w PHP przez kamiz Obywatel (1,010 p.)
Witam, mam pytanie jak można zrobić przesuwanie góra/dół rekordów w sql ?

Żeby na stronie wystarczylo kliknąć przycisk i rekord sie przesuwa w górę.

 

Pozdrawiam
komentarz 1 lipca 2019 przez DragonCoder Nałogowiec (36,500 p.)
Nie mozesz ich posortowac?

2 odpowiedzi

0 głosów
odpowiedź 1 lipca 2019 przez Tomek Sochacki Ekspert (227,490 p.)
nigdy ale to w żadnym wypadku nie modyfikuj kolejnosci rekordow zapisanych w bazie, to wielki błąd. Takie rzeczy robi się poprzez odpowiednie sortowanie w zapytaniu lub w api, ewentualnie client side.
0 głosów
odpowiedź 1 lipca 2019 przez Chess Szeryf (76,730 p.)
edycja 1 lipca 2019 przez Chess

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.

Podobne pytania

0 głosów
2 odpowiedzi 327 wizyt
pytanie zadane 1 listopada 2017 w PHP przez koyoo Początkujący (340 p.)
0 głosów
0 odpowiedzi 151 wizyt
pytanie zadane 17 października 2016 w PHP przez Jaroslaw Roj Obywatel (1,990 p.)
0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 24 grudnia 2015 w PHP przez Miko Obywatel (1,480 p.)

93,656 zapytań

142,577 odpowiedzi

323,100 komentarzy

63,174 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...