Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sortowanie wedłóg czasu i zmiana id wedłóg najnowszej daty
szypi1989
post 25.03.2012, 09:07:38
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
mortus
post 25.03.2012, 11:06:16
Post #2





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

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


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.
Go to the top of the page
+Quote Post
szypi1989
post 25.03.2012, 13:16:50
Post #3





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

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


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

Ten post edytował szypi1989 25.03.2012, 13:38:03
Go to the top of the page
+Quote Post
mortus
post 25.03.2012, 14:39:12
Post #4





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
szypi1989
post 25.03.2012, 19:59:35
Post #5





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

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


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

Ten post edytował szypi1989 25.03.2012, 20:17:01
Go to the top of the page
+Quote Post
mortus
post 25.03.2012, 20:04:54
Post #6





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

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


No w powyższym zapytaniu dopisałem [, ...] oznaczające dodatkowe kolumny, co trzeba oczywiście z zapytania usunąć.
Go to the top of the page
+Quote Post
szypi1989
post 25.03.2012, 20:18:12
Post #7





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

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


usunełem te kolumny oczywiście już odrazu,jednak działa,wszystko przez to że nie zrobiłem Aliasów.Dzięki bardzo:)

Ten post edytował szypi1989 25.03.2012, 20:20:39
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 13:28