[MySQL] Usuwanie powtarzających się elementów

0

Witam!
Mam np. taką tabelę:

rozszerzenie | rodzaj
----------------------
    exe      | program
    jpg      | grafika
    zip      | archiwum
    bmp      | grafika
    rar      | archiwum
    gif      | grafika

Teraz chciałbym usunąć z niej dublujące się rekordy wg. kolumny 'rodzaj', tak aby po operacji usuwania zostało tylko po 1 elemencie (nie jest ważne które pozostaną), czyli moja tabelka powinna wyglądać np. tak:

rozszerzenie | rodzaj
----------------------
    exe      | program
    bmp      | grafika
    rar      | archiwum

Myślałem o wykorzystaniu DISTINCT.. ale mi nie wyszło..

DELETE FROM Pliki WHERE (
SELECT DISTINCT rodzaj
FROM Pliki
);

aha to ma być jedno zapytanie może mieć podzapytania ale ma być jedno.

0

nie zrobisz tego w jednym zapytaniu - proponował bym stored proc

  1. najpierw robisz zapytanie typu select rodzaj, count(rodzaj) from pliki group by rodzaj having count(rodzaj) > 1
  2. potem w pętli robisz
    ile = count(rodzaj)
    rodz = rodzaj
    powyższe to dane z pierwszego zapytania
    delete from(pliki) where roz in (select rozsz from pliki where rodzaj = rodz limit ile - 1)
0

Dzięki.. ale chodzi o to żeby użyć tylko zapytań SQLa. Przy pomocy php to żaden problem.. Wiem, że można to zrealizować za pomocą jednego rozbudowanego zapytania (zawierającego oczywiście podzapytania). Wiem, bo mój prowadzący wymyślił to zadanie.. i jest ono do zrealizowania..

0

U mnie na Postgresie takie zapytanie daje oczekiwany rezultat:

DELETE FROM pliki PZ WHERE rozszerzenie !=
    (SELECT MIN(rozszerzenie) FROM pliki PW
     WHERE PW.rodzaj = PZ.rodzaj GROUP BY rodzaj)

Tak. MIN() jest zdefiniowane dla typów znakowych :)

Przepraszam, że rozwaliłem layout tą przydługą nazwą [wstyd]

// scaliłem posty, jako ze pisane z tego samego IP zmieniłem autora - m.Q

0
Misiekd napisał(a)

a zobacz to http://www.xaprb.com/blog/200[...]lete-duplicate-rows-with-sql/

No jest tam rozwiązanie tylko za pomocą kilku zapytań.. :/

to nie rozwiązuje mojego problemu..

Potrafię wybrać elementy tak żeby pozostawić po 1 sztuce każdego.. ale nie potrafię tego usunąć :(

SELECT DISTINCT rodzaj FROM Pliki
0

Hmm. Próbowałeś mojego zapytania?

0

Tak próbowałem.. nie trawi go :/ tzn. tego MIN .. nie wiem jak to ugryźć

0

Dziwne.

Dokumentacja MySQL napisał(a)

MIN(expr), MAX(expr)
Returns the minimum or maximum value of expr. MIN() and MAX() may take a string argument; in such cases they return the minimum or maximum string value.

No to ja nie mam więcej pomysłów.

0

Jeżeli ma być na raz, to tylko stored proc. Innaczej się nie da. Trzeba pobrać min wartości dla count(*)>1 do bufora, a drugim zapytaniem je usunąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0