Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Pozostawienie tylko unikalnych rekordów
Forum PHP.pl > Forum > Przedszkole
b_chmura
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".
erix
Hmm...
  1. DELETE FROM tabela WHERE ID NOT IN (SELECT ID FROM tabela GROUP BY ID HAVING COUNT(ID)=1)

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


Nie rozumiem...
erix
Pokaż całe Twoje zapytanie.
b_chmura
  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
erix
Spróbuj zaliasować nazwę tabeli w podzapytaniu, a jeśli to nie pomoże - to chyba pozostaje tylko tabela tymczasowa.
b_chmura
Z aliasem nie działa, ten sam błąd.

Z tabelą tymczasową chyba nie będę umiał sobie poradzić. Możesz coś zaproponować?
bemol
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.
mortus
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.
b_chmura
  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...
mortus
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);
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-2025 Invision Power Services, Inc.