第一个查询:
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/