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表中。

谢谢

2 Solutions collect form web for “MySQLjoinwhere子句”

你需要把它放在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