开发者社区> 问答> 正文

MySQL加入where子句

我有两个要加入的表。

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

基本上这是我到目前为止的查询:

SELECT * FROM categories LEFT JOIN user_category_subscriptions ON user_category_subscriptions.category_id = categories.category_id 这很好用,但是我想在查询的末尾添加一个where子句,然后从本质上使它成为一个内部/等参连接。

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_category_subscriptions表中的user_id。

谢谢

展开
收起
保持可爱mmm 2020-05-11 10:30:32 340 0
1 条回答
写回答
取消 提交回答
  • 您需要将其放在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条件,您指定将要连接到表的行集。这意味着,它计算user_id = 1第一,并采取子集user_category_subscriptions用user_id的1加入到所有的行categories。这将为您提供中的所有行categories,而只有categories该特定用户已订阅的行中的列才包含任何信息user_category_subscriptions。当然,所有其他字段categories将null在各user_category_subscriptions列中填充。

    相反,where子句执行联接,然后减少行集。因此,这将执行所有联接,然后消除所有user_id不等于的行1。您将获得效率低下的方法inner join。

    希望这会有所帮助!来源:stack overflow

    2020-05-11 10:30:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像