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);

5 thoughts on “SQL: odwrócony SELECT DISTINCT

  1. 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) ?

  2. @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 ;)

  3. "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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>