Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Zamiana wartości w tabeli
rolnix
post
Post #1





Grupa: Zarejestrowani
Postów: 115
Pomógł: 0
Dołączył: 16.04.2005
Skąd: Białowieża

Ostrzeżenie: (0%)
-----


Witam.

Specyfikacja sytuacji:

Elementy w moim systemie menu są sortowane według pola 'order' od zera w górę, w panelu administracyjnym jest opcja przesuwania ich w górę oraz i w dół. Oto funkcja, która służy mi do przykładowego przesunięcia danego elementu tablicy "w górę":

  1. <?php
  2. function up_menu_item() {
  3. global $sql;
  4. $menuitemid = GetPageArgument('menu_item_id', 0); // biorę id itemu do przesunięcia z $_GET
  5.  
  6. $sql->query('SELECT `order` FROM `###menuitems` WHERE `id`='.$menuitemid); // pobieram aktualną wartość pola 'order'
  7. if ($sql->num_rows() < 1) return; // jeśli nie ma takowego, przerywam
  8. $row = $sql->fetch_array();
  9. $baseitem_order = $row['order'];
  10.  
  11. $sql->query('SELECT `id` FROM `###menuitems` WHERE `order`='.($baseitem_order-1)); // pobieram id jednego pola "wyżej"
  12. if ($sql->num_rows() < 1) return; // jeśli nie ma takowego, przerywam
  13. $row = $sql->fetch_array();
  14. $otheritem_id = $row['id'];
  15.  
  16. $sql->query('UPDATE `###menuitems` SET `order`=`order`-1 WHERE `id`='.$menuitemid); // zamieniam ordery
  17. $sql->query('UPDATE `###menuitems` SET `order`=`order`+1 WHERE `id`='.$otheritem_id);
  18. }
  19. ?>


Specyfikacja rezultatu:

Działa bez zarzutu.

Specyfikacja problemu:

Cholera, tutaj są aż cztery zapytania x)

Pytanie:

Ma ktoś pomysł, jak zamienić te order'y szybciej i za pomocą mniejszej liczby zapytań?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
rolnix
post
Post #2





Grupa: Zarejestrowani
Postów: 115
Pomógł: 0
Dołączył: 16.04.2005
Skąd: Białowieża

Ostrzeżenie: (0%)
-----


Heaven, jesteś moim pozytywnym bożyszczem :*

W mojej wersji wygląda to w ten sposób:

  1. UPDATE ###menuitems c, ( (SELECT `id`, ord.`order`
  2. FROM ###menuitems, (SELECT `order`
  3. FROM ###menuitems WHERE `order` < (SELECT `order`
  4. FROM ###menuitems WHERE `id` = '.$menuitemid.'
  5. LIMIT 1 )
  6. ORDER BY `order` DESC LIMIT 1 ) AS ord
  7. WHERE `id` = '.$menuitemid.')
  8. UNION
  9. (SELECT c1.`id`, ord.`order`
  10. FROM ###menuitems c1, (SELECT `order`
  11. FROM ###menuitems WHERE `id` = '.$menuitemid.') as ord
  12. WHERE c1.`order` < (SELECT `order`
  13. FROM ###menuitems WHERE `id` = '.$menuitemid.'
  14. LIMIT 1 )
  15. ORDER BY c1.`order` DESC LIMIT 1 )) AS nowe_dane
  16. SET c.`order` = nowe_dane.`order`
  17. WHERE c.`id` = nowe_dane.`id`


I działa bez zarzutu. Dziękuję bardzo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Jednak, jeśli miałbyś minimalne chęci, mógłbyś przynamniej pobieżnie wytłumaczyć, jakim mechanizmem to działa? Paru rzeczy nie mogę skojarzyć, a chcę się doskonalić :]

Ten post edytował rolnix 11.11.2007, 15:13:02
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 12.10.2025 - 21:42