Mam dwa stoły, do których chcę dołączyć.
Chcę, aby wszystkie kategorie znajdowały się w tabeli kategorii, a także wszystkie kategorie zasubskrybowane przez użytkownika w tabeli category_subscriptions.
w zasadzie to jest moje zapytanie 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ć klauzulę where na końcu zapytania, która następnie zasadniczo czyni ją złączeniem wewnętrznym / equi.
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ć wszystkie kategorie, a także wszystkie kategorie zasubskrybowane przez określonego użytkownika za pomocą tylko jednego zapytania?
category_id jest kluczem zarówno w tabeli kategorii, jak i subskrypcji_kategorii_użytkowników. user_id rezydujący w tabeli user_category_subscriptions.
dzięki
mysql
join
where-clause
mmundiff
źródło
źródło
Odpowiedzi:
Musisz to umieścić w
join
klauzuli, a niewhere
:SELECT * FROM categories LEFT JOIN user_category_subscriptions ON user_category_subscriptions.category_id = categories.category_id and user_category_subscriptions.user_id =1
Zobacz, z
inner join
umieszczeniem klauzuli wjoin
lubwhere
jest równoważne. Jednak w przypadku plikuouter join
są one bardzo różne.W
join
stanie określić zestaw wierszy, które będzie łączącą do stołu. Oznacza to, żeuser_id = 1
najpierw oblicza i pobiera podzbióruser_category_subscriptions
zuser_id
lub,1
aby dołączyć do wszystkich wierszy wcategories
. To da ci wszystkie wiersze wcategories
, a tylko te,categories
które subskrybował ten konkretny użytkownik, będą miały jakiekolwiek informacje wuser_category_subscriptions
kolumnach. Oczywiście wszystkie innecategories
zostaną wypełnionenull
wuser_category_subscriptions
kolumnach.I odwrotnie,
where
klauzula wykonuje sprzężenie, a następnie zmniejsza zestaw wierszy. To wykonuje wszystkie łączenia, a następnie eliminuje wszystkie wiersze, w którychuser_id
nie są równe1
. Pozostaje nieefektywny sposób na uzyskanie domenyinner join
.Mam nadzieję, że to pomoże!
źródło
A
iB
tabela? Czy możesz przeformułować swoje pytanie?Spróbuj tego
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
źródło