2009-08-02 15 views
103

Mam dwie tabele, które chcę dołączyć.MySQL dołącz do klauzuli gdzie

Chcę, aby wszystkie kategorie w tabeli kategorii, a także wszystkie kategorie subskrybowane przez użytkownika w tabeli categorysubscriptions.

zasadzie to mój kwerendy do tej pory:

SELECT * 
FROM categories 
LEFT JOIN user_category_subscriptions 
    ON user_category_subscriptions.category_id = categories.category_id 

Działa to dobrze, ale chcę dodać WHERE na końcu zapytania, które następnie w zasadzie sprawia, że ​​wewnętrzna/equi przyłączyć.

SELECT * 
    FROM categories 
    LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id 
    WHERE user_category_subscriptions.user_id = 1 

Jak uzyskać dostęp do wszystkich kategorii, a także wszystkich kategorii subskrybowanych przez konkretnego użytkownika, używając tylko jednego zapytania?

ID_kategorii jest kluczem w tabelach kategorii i user_category_subscriptions. identyfikator_użytkownika znajdujący się w tabeli user_category_subscriptions.

dzięki

+0

wierzę, że jest ona nazywana „Prawo Dołącz”, jeśli się nie mylę? –

+0

@TylerCarter na pewno się pomyliłeś :) –

Odpowiedz

221

trzeba umieścić go w klauzuli join, nie where:

SELECT * 
FROM categories 
LEFT JOIN user_category_subscriptions ON 
    user_category_subscriptions.category_id = categories.category_id 
    and user_category_subscriptions.user_id =1 

See, z inner join, umieszczenie klauzuli w join lub where jest równoważny. Jednak z outer join są one bardzo różne.

Jako warunek join określasz zestaw wierszy, który chcesz dołączyć do tabeli. Oznacza to, że najpierw ocenia on user_id = 1 i pobiera podzbiór user_category_subscriptions z user_id z 1, aby dołączyć do wszystkich wierszy w categories. To da ci wszystkie wiersze w categories, podczas gdy tylko categories, który ten konkretny użytkownik subskrybuje, będzie zawierał jakiekolwiek informacje w kolumnach user_category_subscriptions. Oczywiście wszystkie pozostałe categories będą wypełnione null w kolumnach user_category_subscriptions.

Odwrotnie, klauzula where łączy i następnie redukuje zestaw wierszy. Tak więc robi to wszystkie sprzężenia, a następnie eliminuje wszystkie wiersze, w których user_id nie jest równy 1. Pozostaje ci mało skuteczny sposób na uzyskanie inner join.

Mam nadzieję, że to pomoże!

+1

+1 za genialną objaśnioną odpowiedź. – simnom

+1

+1 za wspaniałą odpowiedź! –

+2

Ładnie postawić pytanie i ładnie umieścić odpowiedź! zaoszczędziłem mój czas. wielkie dzięki! –

10

Spróbuj

SELECT * 
    FROM categories 
    LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id 
    WHERE user_category_subscriptions.user_id = 1 
      or user_category_subscriptions.user_id is null 
+0

Jeśli nadal otrzymuję ten sam błąd za pomocą tego kodu, czego szukam dalej. –

Powiązane problemy