mysql - 使用别名优化 Select 子查询

标签 mysql sql

我有一个查询,它从子查询中的同一个表中选择多个值

SELECT ...,
(
    SELECT IFNULL(SUM(pts), 0)
    FROM grades 
    WHERE s.id = student 
) AS spts,
(
    SELECT IFNULL(SUM(mat), 0)
    FROM grades 
    WHERE s.id = student
) AS smat,
(
    SELECT IFNULL(SUM(bio), 0)
    FROM grades 
    WHERE s.id = student
)AS sbio
FROM ...

它现在工作得很好,但我认为它可以优化为一个子查询而不是 3 个。

我尝试过的

SELECT ...,
(
    SELECT IFNULL(SUM(pts), 0) AS spts, IFNULL(SUM(mat), 0) AS smat, IFNULL(SUM(bio), 0) AS sbio
    FROM grades
    WHERE s.id = student
)
FROM ...

但我不断收到以下错误

"message":SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)

预期输出

{
"spts": "89",
"smat": "44",
"sbio": "45"
}

最佳答案

使用左连接简化它:

SELECT ...,
       COALESCE(spts, 0) as spts,
       COALESCE(smat, 0) as smat,
       COALESCE(sbio, 0) as sbio
FROM ... LEFT JOIN
     (SELECT student, SUM(pts) AS spts, SUM(mat) AS smat, SUM(bio) AS sbio
      FROM grades
      GROUP BY student
     ) g
     ON s.id = g.student;

根据 FROM 子句(以及可能的 WHERE 子句)中的其他内容,这可能不会加快查询速度。

关于mysql - 使用别名优化 Select 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46045306/

相关文章:

php - 使用 2 个表和 3 个日期字段连接按降序获取多个日期的问题

mysql - 更新记录 vb.net 和 mysql 期间输入字符串格式不正确消息错误

sql - MySQL:返回具有 50 个 ID 的单个记录,而不是具有单个 ID 的 50 个记录

sql - SQL Server 中的 "PARALLEL"等效项是什么

mysql - 用于带有日期范围条件的 Group By 和 SUM 的 sql

MySQL 根据前一行(同一列)更新列

php - 以安全的方式存储 MySQL 连接数据

java - JPA QueryDSL 存在并计数

sql - 创建 SQL 索引的最佳方式?

java - java中带有字符串的sql语法