我想加入两张桌子.

我想要categories表中的所有类别,以及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_订阅中的键.用户类别订阅表中的用户id.

谢谢

推荐答案

你需要把它放在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中加入一个子句就相当于inner join.然而,有了outer join,它们就大不相同了.

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

相反,where子句进行连接,then减少行集.这会进行所有的连接,然后消除user_id不等于1的所有行.你只能用一种效率低下的方式来获得inner join分.

希望这有帮助!

Mysql相关问答推荐

带负数的MySQL子字符串_索引

如何在Sequelize中创建限制查询?

我可以指示MariaDB-Install-db和MariaDB忽略配置中的用户设置吗?

LaravelEloquent ToSql()缺少连接表

Python MySQL-无法从数据库中删除行

含有子查询的MySQL函数出现语法错误

将类图转换为SQL数据库

Mysql 查询返回未定义的 node.js

条件触发mysql

高效的 SQL 查询,用于计算半小时时间序列中已发生的行的一部分

如何将结果列中的不同值按其他列sql中的值带入单行

有人可以帮我优化这个查询吗?

MySQL 将分组 JSON Select 转换为单个 JSON 对象

访问 nodejs、mysql 和 json 中的嵌套对象数组

使用 DISTINCT 时无法从数据库中查询所有数据

MySQL:使用来自查询的信息创建一个新表

MySQL 添加一个 NOT NULL 列

如何将时刻 JS 时间插入 MySQL

MySQL - 表'my_table'没有被锁定表锁定

MySQL 中的 VARCHAR(255) 和 TINYTEXT 字符串类型有什么区别?