简体   繁体   English

使用别名优化选择子查询

[英]optimize Select sub query using alias

i have a query that selects multiple values from the same table in sub query 我有一个查询,可以从子查询的同一张表中选择多个值

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 ...

its working perfectly now but i think it can be optimized into one sub query instead of 3. 它现在可以正常工作,但我认为可以将其优化为一个子查询,而不是3。

what i tried 我尝试过的

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 ...

but i keep getting the following error 但我不断收到以下错误

"message":SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s) “ message”:SQLSTATE [21000]:基数违反:1241操作数应包含1列

expected output 预期产量

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

Simplify it using a left join : 使用left join来简化它:

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;

Depending on what else is in the FROM clause (and potentially WHERE clause), this may not speed up the query. 根据FROM子句(可能还有WHERE子句)中的其他内容,这可能不会加快查询速度。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM