MySQL与WHERE子句的连接

2admgd59  于 2022-09-18  发布在  Java
关注(0)|答案(3)|浏览(131)

我有两张table想要加入。

我希望CATEGORY表中的所有类别以及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是CATEGORIES表和USER_CATEGORY_SUBSCRIPTIONS中的键。驻留在USER_CATEGORY_SUBSCRIPTIONS表中的user_id。

谢谢

beq87vna

beq87vna1#

您需要将其放在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_id1user_category_subscriptions的子集连接到categories中的所有行。这将为您提供categories中的所有行,而只有此特定用户订阅的categories将在user_category_subscriptions列中包含任何信息。当然,所有其他categories将在user_category_subscriptions列中填充null

相反,where子句执行联接,然后THEN减少行集。因此,这将执行所有连接,然后删除user_id不等于1的所有行。你只剩下一种低效的方法来获得inner join

希望这能有所帮助!

nbnkbykc

nbnkbykc2#

Try this

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
von4xj4u

von4xj4u3#

这必须与WHERE子句一起使用

SELECTFROM(SELECTFROM CACTIONS LEFT JOIN USER_CATEGORY_SUBSCRIPTIONS ON USER_CATEGORY_SUBSCRIPTIONS on USER_CATEGORY_SUBSCRIPTIONS On USER_CATEGORY_SUBSCRIPTIONS_ID)TB WHERE USER_CATEGORY_SUBSCRIPTIONS.user_id=1

相关问题