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