Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak skasować zduplikowane rekordy z danym parametrem
Forum PHP.pl > Forum > Bazy danych > MySQL
oczko991
Witam.

Posiadam tabelę: cb_cms_ksiazki

i chciałbym skasować rekordy `title`, ale zostawić tylko ten który ma najwyższy `dls`

czyli np.

Agrafka - Maroko, dls 2
Agrafka - Maroko, dls 0
Agrafka - Maroko, dls 0
Agrafka - Maroko, dls 0
Agrafka - Maroko, dls 233
Agrafka - Maroko, dls 500

usunac wszystkie, a zostawic tylko tą z dls 500


  1.  
  2.  
  3. DELETE FROM `cb_cms_ksiazki` WHERE `dls`= questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif
  4.  
  5.  

a nie to bedzie zle zapytanie, bo to skasuje rekordy rozne a nie zduplikowane ;/
viking
  1. DELETE FROM `cb_cms_ksiazki` WHERE `dls` NOT IN (SELECT max(`dls`) FROM `cb_cms_ksiazki`)


Tylko uważaj bo pewnie chcesz jakoś po tytule albo czymś grupować. To takiego warunku nie uwzględni.
oczko991
Ale czy to mi wywali rekordy z najmniejszym dls spośród duplikatow?
Czy czasem z calej bazy?
viking
A skąd mogę wiedzieć co zrobi nie znając struktury bazy? Poza tym liczę ze nie będziesz tego testował na produkcyjnej bazie a będzie to wyłącznie podpowiedź jak napisać finale zapytanie.
mmmmmmm
Mam nadzieję, że tego nie wykonałeś. A jeśli już, to że wcześniej kopię zrobiłeś.
Bo po wykonaniu tego zapytania zostałby ci w tabeli 1 (słownie: JEDEN) rekord.
W zapytaniu zabrakło grupowania. Prawidłowo powinno być:
  1. DELETE FROM `cb_cms_ksiazki` WHERE `dls` NOT IN (SELECT max(`dls`) FROM `cb_cms_ksiazki` GROUP BY title)
viking
Dlatego napisałem żeby dodał grupowanie po odpowiedniej kolumnie, najpewniej title.
oczko991

  1. DELETE FROM `cb_cms_ksiazki` WHERE `dls` NOT IN (SELECT max(`dls`) FROM `cb_cms_ksiazki` GROUP BY title)

WYNIK: #1093 - You can't specify target table 'cb_cms_ksiazki' for update in FROM clause


znalazłem takie polecenie

  1. SELECT title, COUNT( * ) AS cnt
  2. FROM cb_cms_ksiazki
  3. GROUP BY title
  4. HAVING cnt >1
  5. ORDER BY `cnt` ASC
  6.  

ono mi pokazuje wszystkie duplikaty


i jak teraz zrobic polecenie na wywalenie kazdego a zostawic z najwiekszym dls?
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.