Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie wedłóg czasu i zmiana id wedłóg najnowszej daty
Forum PHP.pl > Forum > Bazy danych > MySQL
szypi1989
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
mortus
Najpierw
  1. SET @i = 0;

Później
  1. UPDATE `tabela1` SET `id` = (@i := @i + 1) ORDER BY `time` DESC

Wcześniej zrób kopię danych do jakiejś tabeli tymczasowej, bo zapytanie może coś poknocić, choć nie powinno.
szypi1989
ok.działa.Ale zauważyłem że wykonuje mi od następnego id i zgłasza błąd:#1062 - Duplicate entry '0' for key 'PRIMARY'
Jednak coś nie działa:( przez ten błąd
mortus
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.
szypi1989
chyba coś jest w tym zapytaniu źle,ponieważ występuje błąd
EDIT:działa ale tylko jak skopije z jednej tabeli do nowej ponieważ inaczej wyskakuje mi błąd
mortus
No w powyższym zapytaniu dopisałem [, ...] oznaczające dodatkowe kolumny, co trzeba oczywiście z zapytania usunąć.
szypi1989
usunełem te kolumny oczywiście już odrazu,jednak działa,wszystko przez to że nie zrobiłem Aliasów.Dzięki bardzo:)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.