MySQL:来自子查询的总和
Posted
技术标签:
【中文标题】MySQL:来自子查询的总和【英文标题】:MySQL: sum values from subqueries 【发布时间】:2018-03-19 08:07:54 【问题描述】:是否可以对子查询中的两个值求和?
我需要选择三个值:total_view、total_cmets 和 rating。
两个子查询都非常复杂,所以我不希望重复它。
我的查询示例:
SELECT p.id,
(
FIRST subquery
) AS total_view,
(
SECOND subquery
) AS total_comments,
(
total_view * total_comments
) AS rating
FROM products p
WHERE p.status = "1"
ORDER BY rating DESC
【问题讨论】:
没有。并非没有围绕所有这些构建一个包装查询。但是 mysql 并不关心“复杂”,那为什么不直接写出来呢? 【参考方案1】:我建议使用子查询:
SELECT p.*, (total_view * total_comments) as rating
FROM (SELECT p.id,
(FIRST subquery) AS total_view,
(SECOND subquery) AS total_comments,
FROM products p
WHERE p.status = '1' -- if status is a number, then remove quotes
) p
ORDER BY rating DESC;
MySQL 实现子查询。但是因为ORDER BY
在计算列上,无论如何它都需要对数据进行排序,所以物化不是额外的开销。
【讨论】:
这是我认为最简单的解决方案。写起来很短,运行起来很高效。【参考方案2】:您不能使用别名,但可以使用相同的代码,例如:
SELECT p.id,
(
FIRST subquery
) AS total_view,
(
SECOND subquery
) AS total_comments,
(
(
FIRST subquery
) * (
SECOND subquery
)
) AS rating
FROM products p
WHERE p.status = "1"
ORDER BY rating DESC
【讨论】:
你知道 MySQL 的优化器是否真的足够聪明,可以避免两次运行相同的子查询? 我的回答与提供的问题严格相关..但无论如何..是的。我知道.. 另一个问题,你知道是哪个版本添加的吗?我刚刚在 5.6 上尝试过,它仍然运行子查询两次。 @dnoeth 子查询的 sql 优化器主要与 IN 或 EXISTS , FROM() 子查询有关。而且似乎 .not 用于列子查询,因为提供的问题 .. 我记得没有明显在 5.6 和 5.7 之间更改 .. 我同意你的观点,对于有问题的“列”子查询 .. 更好的优化是基于使用 FROM 子查询更改“列”子查询,因此重用由 sql 引擎创建的临时表. ..希望有用。【参考方案3】:只需使用派生表即可重用别名:
SELECT p.id,
total_view,
total_comments,
total_view * total_comments AS rating
FROM
(
SELECT p.id,
(
FIRST subquery
) AS total_view,
(
SECOND subquery
) AS total_comments
FROM products p
WHERE p.status = "1"
) as dt
ORDER BY rating DESC
【讨论】:
用单引号代替双引号。 @TheImpaler:不是我使用双引号,而是从 OP 复制的。如果status
是一个数字列,它应该没有任何引号:-)以上是关于MySQL:来自子查询的总和的主要内容,如果未能解决你的问题,请参考以下文章