Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Pozostawienie tylko unikalnych rekordów
b_chmura
post
Post #1





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


Witam
Chce pozostawić jedynie niepowtarzające się rekordy w bazie. Stosuję do tego:

  1. ALTER IGNORE TABLE `tabela` ADD UNIQUE INDEX(`nazwa`);
  2. ALTER TABLE `tabela` DROP INDEX `nazwa`;


Niby działa dobrze ale! Zostawia najstarszy rekord... ja zaś potrzebuję by to najnowszy nie został usunięty.
Możecie coś poradzić?

Przy okazji jak zostawiać w bazie dla przykładu tylko 5 najnowszych rekordów? Biorąc pod uwagę, że id rekordów nie są "id+1".
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Hmm...
  1. DELETE FROM tabela WHERE ID NOT IN (SELECT ID FROM tabela GROUP BY ID HAVING COUNT(ID)=1)

?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
b_chmura
post
Post #3





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


Cytat
MySQL zwrócił komunikat:
#1093 - You can't specify target table 'lp_last_read' for update in FROM clause


Nie rozumiem...
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Pokaż całe Twoje zapytanie.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
b_chmura
post
Post #5





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


  1. DELETE FROM lp_last_read WHERE nazwa NOT IN (
  2. SELECT nazwa
  3. FROM lp_last_read
  4. GROUP BY nazwa
  5. HAVING COUNT( nazwa ) =1
  6. )


Cytat
lp_last_read
----------------------
id|nazwa|linki|time


Ten post edytował b_chmura 1.03.2010, 17:08:18
Go to the top of the page
+Quote Post
erix
post
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Spróbuj zaliasować nazwę tabeli w podzapytaniu, a jeśli to nie pomoże - to chyba pozostaje tylko tabela tymczasowa.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
b_chmura
post
Post #7





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


Z aliasem nie działa, ten sam błąd.

Z tabelą tymczasową chyba nie będę umiał sobie poradzić. Możesz coś zaproponować?
Go to the top of the page
+Quote Post
bemol
post
Post #8





Grupa: Zarejestrowani
Postów: 286
Pomógł: 29
Dołączył: 5.04.2007
Skąd: Rymanów Zdrój/Rzeszów

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


co do drugiego pytania. Jeśli id są dawane po kolei (czyli np. 1,10,14,19,20,21,23,60) z auto_increment to dajesz order by id desc limit 0,5.
Jeśli są wypełniane po usunięciu to dodać pole Data i sortować wg daty.

co do pierwszego to zaraz może coś wykombinuje.


--------------------
Tym ludziom zaufałem i dobrze na tym wyszedłem:
kresh
Darti
piotrekkr
Bez nich wiele bym nie zrobił. Dzięki im za to!
Go to the top of the page
+Quote Post
mortus
post
Post #9





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

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


Witam.
Przede wszystkim napisz coś więcej na temat tabeli lp_last_read, same nazwy pól nie wystarczą, ważne są np. index-y, autoinkrementacja, klucze podstawowe itp (najlepiej zrób dump-a). Zdefiniuj również, które to są niepowtarzające się rekordy, bo dla mnie są to takie rekordy, w których pola mają takie same wszystkie wartości. Wtedy na pewno coś poradzimy.
Go to the top of the page
+Quote Post
b_chmura
post
Post #10





Grupa: Zarejestrowani
Postów: 813
Pomógł: 34
Dołączył: 18.03.2007
Skąd: o stamtąd

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


  1. CREATE TABLE `lp_last_read` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `nazwa` varchar(25) NOT NULL,
  4. `link` varchar(255) NOT NULL,
  5. `time` int(11) NOT NULL,
  6. KEY `id` (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=25 ;


Proszę bardzo smile.gif

Zasada można się chyba domyśleć z poprzednich zapytań jednak napiszę.
Zapytanie ma usunąć powtarzające się rekordy (czyli takie które mają taką samą wartość w kolumnie "nazwa") zostawiając jeden z najwyższym id/time (time = time())

Staram się zrobić to jednym zapytaniem ewentualnie zapytaniem i podzapytaniem i mi nie wychodzi...
Go to the top of the page
+Quote Post
mortus
post
Post #11





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

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


Oto rozwiązania dla problemów:
  1. DELETE FROM lp_last_read WHERE id NOT IN (SELECT id FROM (SELECT * FROM lp_last_read ORDER BY id DESC) AS posortowane GROUP BY posortowane.nazwa);
  1. DELETE FROM lp_last_read WHERE id NOT IN (SELECT id FROM (SELECT * FROM lp_last_read ORDER BY id DESC LIMIT 5) AS piec_ostatnich);
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 Aktualny czas: 19.08.2025 - 11:34