为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL与where子句连接

MySQL与where子句连接

哆啦的时光机 2019-08-30 16:09:35
我有两张桌子想加入。我想要类别表中的所有类别以及category_subscriptions表中用户订阅的所有类别。基本上这是我目前的查询:SELECT *FROM categoriesLEFT JOIN user_category_subscriptions      ON user_category_subscriptions.category_id = categories.category_id这工作正常,但我想在查询的末尾添加一个where子句,然后基本上使它成为内部/ equi连接。   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 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

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


希望这有帮助!


查看完整回答
反对 回复 2019-08-30
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

试试这个


  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


查看完整回答
反对 回复 2019-08-30
  • 2 回答
  • 0 关注
  • 632 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信