Mysql - 来自 1 个表的 3 个单独的总和 - 工作 - 搜索更好的查询

标签 mysql sql

故事:我有一个 mysql 表,我通过下面的查询获得了 3 个值(总和)。查询正在运行。但它需要 7.624 秒,对我来说太长了。只是想找到一个更好的 sql 查询。你能帮帮我吗?

SELECT
    DATE(a.tarih),
    (
        SELECT
            SUM(s.stoplam)
        FROM
            siparis s
        WHERE
            s.durum_id IN (4, 26, 27, 28, 29)
        AND DATE(s.tarih) = DATE(a.tarih)
    ) AS iptal,
    (
        SELECT
            SUM(c.stoplam)
        FROM
            siparis c
        WHERE
            c.durum_id NOT IN (4, 26, 27, 28, 29)
        AND DATE(c.tarih) = DATE(a.tarih)
    ) AS Ciro,
    (
        SELECT
            SUM(d.stoplam)
        FROM
            siparis d
        WHERE
            d.durum_id NOT IN (4, 26, 27, 28, 29)

        AND DATE(d.tarih) = DATE_ADD(
            DATE(a.tarih),
            INTERVAL - 30 DAY
        )
    ) AS GCiro
FROM
    siparis a
WHERE
    DATE(a.tarih) > DATE_ADD(CURDATE(), INTERVAL - 30 DAY)
GROUP BY
    DATE(a.tarih)

最佳答案

我认为使用条件聚合可以更轻松地做到这一点,除了第三个总和:

SELECT DATE(a.tarih),
       SUM(CASE WHEN s.durum_id IN (4, 26, 27, 28, 29) THEN s.stoplam ELSE 0 END) as iptal,
       SUM(CASE WHEN s.durum_id NOT IN (4, 26, 27, 28, 29) THEN s.stoplam ELSE 0 END) as Ciro,
       (SELECT SUM(d.stoplam)
        FROM siparis d
        WHERE d.durum_id NOT IN (4, 26, 27, 28, 29) AND
              DATE(d.tarih) = DATE_ADD(DATE(a.tarih), INTERVAL - 30 DAY)
       ) AS GCiro
FROM siparis a
WHERE DATE(a.tarih) > DATE_ADD(CURDATE(), INTERVAL - 30 DAY)
GROUP BY DATE(a.tarih);

关于Mysql - 来自 1 个表的 3 个单独的总和 - 工作 - 搜索更好的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26676187/

相关文章:

php - 从 PHP 中的 mysql 表中获取总记录的最快方法

php - jQuery UI 自动完成 - 西类牙字符在本地正确显示但在服务器上不正确

mysql - SQL 查询替换并选择特定 DIV 之间的所有内容

mysql - 如何获取群组的最后一条记录?

javascript - jQuery 只为被点击的元素运行函数

mysql - 无法从两个表中获取唯一值

php - 当单元格包含更多以逗号分隔的多值时如何显示数据

mysql - 在行级锁定时提交后是否有必要解锁表?

PHP/SQL 数据库查询的良好实践和安全性

sql - 如果左连接表中的行为空,则使用另一行