MySQL与where子句连接

mmu*_*iff 121 mysql join where-clause

我有两张桌子想加入.

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

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

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我想在查询的末尾添加一个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
Run Code Online (Sandbox Code Playgroud)

如何仅使用一个查询获取特定用户订阅的所有类别以及所有类别?

category_id是类别表和user_category_subscriptions中的键.user_id驻留在user_category_subscriptions表中.

谢谢

Eri*_*ric 267

你需要把它放在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
Run Code Online (Sandbox Code Playgroud)

看一下inner join,把一个条款放在joinwhere等同于.但是,有了outer join它们,它们就大不相同了.

作为join条件,您指定要加入表的行集.这意味着,它计算user_id = 1第一,并采取子集user_category_subscriptionsuser_id1加入到所有的行categories.这将为您提供所有行categories,而只有categories此特定用户订阅的行将在user_category_subscriptions列中包含任何信息.当然,所有其他的categories将被填充nulluser_category_subscriptions列.

相反,where子句执行连接,然后减少行集.因此,这会完成所有连接,然后消除所有user_id不相等的行1.你得到一个效率低下的方法inner join.

希望这有帮助!

  • 很好地提出问题,并很好地回答!节省了我的时间.非常感谢! (2认同)
  • 我非常爱你埃里克,你让我免于哭泣:D (2认同)

小智 10

试试这个

  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
Run Code Online (Sandbox Code Playgroud)

  • 我在我的案例中尝试了这个解决方案,查询成功执行,但记录未过滤。 (2认同)