【问题标题】:MySQL join with where clauseMySQL join with where 子句
【发布时间】:2010-11-16 05:39:04
【问题描述】:

我有两个要加入的表。

我想要类别表中的所有类别,以及 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_id 位于 user_category_subscriptions 表中。

谢谢

【问题讨论】:

  • 如果我没记错的话,我相信它被称为“Right Join”?
  • @TylerCarter 你肯定弄错了 :)

标签: mysql join where-clause


【解决方案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,将子句放入joinwhere 是等效的。但是,outer join 则大不相同。

作为join 条件,您指定要加入表的行集。这意味着它首先评估user_id = 1,然后将user_category_subscriptions 的子集与1user_id 结合到categories 中的所有行。这将为您提供categories 中的所有行,而只有该特定用户已订阅的categories 将在user_category_subscriptions 列中包含任何信息。当然,所有其他categories 将在user_category_subscriptions 列中填充null

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

希望这会有所帮助!

【讨论】:

  • 很好地提出了问题,也很好地提出了答案!节省了我的时间。非常感谢!
  • 我非常爱你,埃里克,你让我免于哭泣:D
  • 另一方面,如果我想为用户生成干净的数据,第二种(哪里)方式更合适。对吗?
  • 您好,我们可以删除 user_category_subscriptions.user_id 为空。为了在 A 表中检索 B 表中 id 为空的详细 id
  • @Veeresh123,AB 表是什么?你能改写你的问题吗?
【解决方案2】:

试试这个

  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

【讨论】:

  • 如果我在使用这段代码时仍然遇到同样的错误,接下来我应该寻找什么。
猜你喜欢
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
相关资源
最近更新 更多