代码之家  ›  专栏  ›  技术社区  ›  mmundiff

MySQL与WHERE子句联接

  •  114
  • mmundiff  · 技术社区  · 17 年前

    我有两张桌子要加入。

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

    本质上,这是我目前为止的问题:

    SELECT *
    FROM categories
    LEFT 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是categories表和用户_category_订阅中的一个键。用户ID位于用户类别订阅表中。

    谢谢

    2 回复  |  直到 10 年前
        1
  •  250
  •   Will Sheppard    14 年前

    你需要把它放进 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 ,在 参加 哪里 是等价的。但是,使用 outer join 它们有很大的不同。

    作为一个 参加 条件,指定要加入表的行集。这意味着它评估 user_id = 1 首先,取 user_category_subscriptions 用一个 user_id 属于 1 连接到中的所有行 categories . 这将给你所有的行 类别 ,而只有 类别 此特定用户订阅的将在 用户类别订阅 柱。当然,所有其他的 类别 将填充 null 用户类别订阅 柱。

    相反地,A 哪里 子句进行联接,并且 然后 减少行集。所以,这将执行所有的连接,然后删除 用户标识 不平等 . 你只剩下一种低效的方法 内连接 .

    希望这有帮助!

        2
  •  10
  •   Taryn Frank Pearson    13 年前

    试试这个

      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
    
    推荐文章