mysql - 解释一下这两个SQL查询之间的区别?

标签 mysql sql

第一个查询:

SELECT 
    d.id,
    d.brand_name,
    count(*) AS no_of_time_used
FROM content oc
LEFT JOIN drama d ON d.id = oc.drama_id
LEFT JOIN orders o ON o.id = oc.order_id
    AND o.fundraiser_id IS NOT NULL
GROUP BY drama_id
ORDER BY no_of_time_used DESC;

第二个查询:

SELECT 
    d.id,
    d.brand_name,
    count(*) AS no_of_time_used
FROM content oc
LEFT JOIN drama d ON d.id = oc.drama_id
LEFT JOIN orders o ON o.id = oc.order_id
WHERE o.fundraiser_id IS NOT NULL
GROUP BY drama_id
ORDER BY no_of_time_used DESC;

这些查询中只有一个区别,即 AND 与 WHERE。在第一个查询中,我在第二个 JOIN 语句之后使用了 AND,而在第二个查询中,我使用了 WHERE 代替了 AND

编辑:两个查询返回不同的结果。

最佳答案

这里的问题是o.fundraiser_id IS NOT NULL的条件。

在查询中,条件位于 ON 子句中:

FROM content oc LEFT JOIN
     drama d
     ON d.id = oc.drama_id LEFT JOIN
     orders o
     ON o.id = oc.order_id AND
        o.fundraiser_id IS NOT NULL

这表示无论 orders 中是否存在匹配,都保留 content 中的所有行。也就是说,行数不会减少(相对于不使用LEFT JOIN 顺序)。

但是,这会影响订单中的。结果集中仅包含非 NULL fundraiser_id 的行。如果没有这样的值,则该 order_id 的列将为 NULL

第二种形式是更典型的形式:

FROM content oc LEFT JOIN
     drama d
     ON d.id = oc.drama_id LEFT JOIN
     orders o
     ON o.id = oc.order_id
WHERE o.fundraiser_id IS NOT NULL

这里的意图确实过滤掉行。它将过滤掉 fundraiser_id 不为 NULL 的行。 NULL 值可以通过两种方式出现:

  • 订单中的值可以为NULL
  • LEFT JOIN 可能找不到匹配的订单

此版本过滤这些行,因此会更改行数。至少,它将第二个 LEFT JOIN 转换为 INNER JOIN

关于mysql - 解释一下这两个SQL查询之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59589420/

相关文章:

sql - 如何计算自下而上的累计和?

sql - 合并 3 个表的结果

php - 加入 ids 与总和

php - 结合 angular js 和 php - 将数据插入数据库失败

php - 登录后从数据库中提取各个用户的数据

SQL查询以获取另一个表中多于一行的行数

SQL 来自联系人的最新照片(按联系人分组)

php - Codeigniter Cpanel 上数据库连接错误

php - 选择查询未在 codeigniter 中执行?

mysql - 从本地机器连接到 AWS 上的 MySQL