SQL: odwrócony SELECT DISTINCT
Czasami człowiek zapomina takich perełek… TAK! Wiem, że jest to rozwiązanie nieoptymalne.
select blabla from
tab as t1,
tab as t2
where t1.id <> t2.id and t1.name = t2.name;
Alternatywą dla tego byłoby użycie:
SELECT DISTINCT(id) from tabela;
wrzucenie tego do tablicy w php, a następnie użycie negacji:
SELECT * FROM tabela WHERE id NOT IN ($tablica);
Jeśli spodobał Ci się ten wpis, rozważ jego skomentowanie lub skorzystanie z RSS-a i w konsekwencji otrzymywania informacji o nowych wpisach do Twojego czytnika.
Komentarze
@radek: Faktycznie, aczkolwiek skupiamy się na rekordzie id. Jeżeli przyjąć takie założenia, name jest tylko dodatkowym atrybutem, który pozwala określić, czy duplikat jest duplikatem (a i to nie zawsze musi być prawdą) – chociaż w tym przykładzie nawet go nie wyświetli w wynikach.
Pierwsze wybierze ci takie rekordy, które mają różne „id”, przy tym samym name.
Drugie zrobi prawie to samo – tzn. wybierze najpierw takie „id” które nie mają duplikatów w tabeli, a następnie tegoż odwrotność (czyli rekordy z duplikatami na polu „id”).
W tym przykładzie (czego nie napisałem, mea culpa) chodziło głównie o wyłapanie rekordów w tabeli, które się rozjechały przez błędy w bazie (na blogu) przy próbie importu.
Jak zwykle: nie jest to gotowe rozwiązanie, a tylko notatka do własnej wiadomości, podlegająca modyfikacjom :) Wszelkie uwagi mile widzane ;)
„tzn. wybierze najpierw takie “id” które nie mają duplikatów w tabeli,” – nie jest to prawda
select distinct(ID) from tabela
zwróci wszystkie wystąpienia ID z tym że wszelkie powtórzenia zostaną zwrócone tylko raz „distinct (different)”
id | name
1 raz
2 dwa
1 trzy
3 cztery
2 piec
zwróci
1,2,3

wydaje mi się, że nie do końca to jest to samo
1 select to wybieranie powtarzających się pól ‘name’
a drugie?
- tworzymy tablicę wszystkich id z tabeli
- wybieramy te wiersze gdzie id jest różne od tablicy (z poprzedniego: wszystkich id z tabeli) ?