MySQLjoinwhere子句
我有两张表我想join。
我希望类别表中的所有类别以及用户在category_subscriptions表中订阅的所有类别。
基本上这是我的查询到目前为止:
SELECT * FROM categories LEFT JOIN user_category_subscriptions ON user_category_subscriptions.category_id = categories.category_id
这工作正常,但是我想添加一个where子句的查询结束,然后本质上使其内部/ equijoin。
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
来看,在join
或者在where
是等价的。 然而, outer join
,他们是非常不同的。
作为join
条件,可以指定要join表的行集。 这意味着它首先评估user_id = 1
,并将user_category_subscriptions
的子集user_id
user_category_subscriptions
1
以joincategories
所有行。 这将为您提供所有categories
的行,而只有此特定用户订阅的categories
才会在user_category_subscriptions
列中包含任何信息。 当然,所有其他categories
将在user_category_subscriptions
列中填充为null
。
相反,一个where
子句进行连接, 然后减less行集。 所以,这会执行所有连接,然后删除user_id
不等于1
所有行。 你留下一个低效的方式来获得一个inner join
。
希望这有助于!
尝试这个
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