题
我想加入两张桌子。
我想要类别表中的所有类别以及category_subscriptions表中用户订阅的所有类别。
基本上这是我目前的查询:
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
这很好但是我想在查询的末尾添加一个where子句,然后基本上使它成为内部/ 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
如何只使用一个查询获取特定用户订阅的所有类别以及所有类别?
category_id是类别表和user_category_subscriptions中的键。 user_id驻留在user_category_subscriptions表中。
感谢
解决方案
您需要将其放在join
子句中,而不是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
请参阅inner join
,在outer join
或user_id = 1
中放置一个子句是等效的。然而,对于user_category_subscriptions
,它们是截然不同的。
作为user_id
条件,您指定要加入表的行集。这意味着它首先评估1
,并将categories
的子集与null
<=>连接到<=>中的所有行。这将为您提供<=>中的所有行,而只有此特定用户订阅的<=>将在<=>列中包含任何信息。当然,所有其他<=>将在<=>列中填充<=>。
相反,<=>子句执行连接,然后减少行集。因此,这将完成所有连接,然后消除<=>不等于<=>的所有行。你得到一个低效的方法来获得<=>。
希望这有帮助!
其他提示
试试这个
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
不隶属于 StackOverflow