Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Sortowanie wedłóg czasu i zmiana id wedłóg najnowszej daty
szypi1989
post
Post #1





Grupa: Zarejestrowani
Postów: 207
Pomógł: 0
Dołączył: 7.09.2010

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


Witam.Otóż jak najktuczeniej i najoptymalniej posortować i zmienić id wedłóg daty mam np.

tabela1
----------------
id |time|name
-----------------
1|2011-10-01
----------------
2|2012-10-01
----------------
3|2011-09-01
----------------

aby tabela po sortowaniu zrobiła się na UPDATE:

tabela1
----------------
id |time|name
-----------------
1|2012-10-01
----------------
2|2011-10-01
----------------
3|2011-09-01
----------------

Poprosti id zmienił się wedłóg najnowszej daty,i chciałbym to zrobić dla 3 tabel na raz(jeśli da radę a jeśli nie to może być dla jednej) w miare optymalnie .
Wiem jak wyciągnąć rekordy wedłóg najnowszej daty,ale niewiem jak najskuteczniej zmienić te id wedłóg tego i odrazu zapisać.Próbuje coś takiego:
  1. UPDATE times t ,(SELECT *
  2. FROM times WHERE times.id > 0
  3. ORDER BY times DESC) AS tab
  4. SET t.times = tab.times
  5. WHERE t.id >0

Ale edytuje mi wszystkie id na najnowszy czas
Proszę o pomoc

Ten post edytował szypi1989 25.03.2012, 11:05:03
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Wykonaj to zapytanie dwukrotnie, przy czym najpierw ustaw dużą wartość zmiennej @i (wartość ostatniego id w tabeli + 1).
  1. SELECT @i := MAX(`id`) + 1 FROM `tabela1`;
  2. UPDATE `tabela1` SET `id` = (@i := @i + 1) ORDER BY `time` DESC;
  3. SET @i = 0;
  4. UPDATE `tabela1` SET `id` = (@i := @i + 1) ORDER BY `time` DESC;

Inaczej chyba nie da się tego zrobić, ponieważ `id` jest w tej tabeli kluczem głównym i bez zastosowania powyższej sztuczki zawsze któryś z wierszy (a dokładniej któraś z wartości id) będzie się powtarzać, co skutkuje wspomnianym błędem.

EDIT1:
Swoją drogą takich rzeczy raczej się nie robi.

Jednak da się to zrobić inaczej:
  1. SET @i = 0;
  2. INSERT INTO `tabela1` (`id`, `time`, `name`[, ...]) SELECT (@i := @i + 1), `t1`.`time`, `t1`.`name`[, ...] FROM `tabela1` `t1` ORDER BY `t1`.`time` DESC ON DUPLICATE KEY UPDATE `tabela1`.`time` = `t1`.`time`, `tabela1`.`name` = `t1`.`name`[, ...];


EDIT2:
Pamiętaj, aby testować zapytania na kopii danych, bo nigdy nie wiadomo, czy wszystko pójdzie dobrze. Np. nie jestem pewien, jak się zachowa drugie zapytanie w sytuacji, gdy któryś z rekordów wcześniej został usunięty.

Ten post edytował mortus 25.03.2012, 15:26:22
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: 26.12.2025 - 18:27