MySQL 加上 where 子句

我想要连接两张表。

我想要类别表中的所有类别,以及用户订阅的所有类别。

到目前为止,这就是我的疑问:

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id

然而,我想在查询的末尾添加一个 where 子句,这样实际上使它成为一个 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

我如何得到所有的类别,以及所有的类别订阅的特定用户只使用一个查询?

Type_ id 是类别表中的键,也是用户类别订阅表中的用户类别订阅. user_ id 中的键。

谢谢

259799 次浏览

你需要把它放在 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,在 joinwhere中放置一个子句是等价的。然而,对于 outer join,它们有很大的不同。

作为 join条件,您可以指定要连接到表的行集。这意味着它首先计算 user_id = 1,然后将 user_category_subscriptions的子集与 1user_id连接到 categories中的所有行。这将为您提供 categories中的所有行,而只有这个特定用户订阅的 categories将在 user_category_subscriptions列中包含任何信息。当然,所有其他 categories都将在 user_category_subscriptions列中用 user_id = 10填充。

相反,一个 where子句执行连接,而 那么减少行集。因此,这将完成所有的连接,然后消除 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

这必须与 哪里子句一起工作

SELECT * FROM (SELECT * FROM Category LEFT JOIN user _ type _ subtions ON user _ type _ subtions. type _ id = Category ories.type _ id) tb 其中 user _ type _ subtions. user _ id = 1