【问题标题】:MySQL Simplify This Query?MySQL 简化这个查询?
【发布时间】:2012-07-12 13:28:11
【问题描述】:

我已经编写 MySQL 查询很长时间了,但是在涉及到这个问题时我完全觉得自己像个新手,而且我似乎无法弄清楚如何简化这个查询。基本上我只是想从我们的数据库中生成一个以逗号分隔的收入列表,最终插入谷歌图表。我还必须为“过去 31 天”制作一个,所以我有点搞砸了,除非我想出了如何简化它。

我的表中的数据库列是...

  • 时间:订单进来的时间 int()(UNIX 时间戳格式)
  • 价格:十进制(10,2)的订单是多少
SELECT
 CONCAT(
 (SELECT SUM(price) FROM orders WHERE time < (UNIX_TIMESTAMP() - (6 * 86400)) AND time > (UNIX_TIMESTAMP() - (7 * 86400))),
 ',',
 (SELECT SUM(price) FROM orders WHERE time < (UNIX_TIMESTAMP() - (5 * 86400)) AND time > (UNIX_TIMESTAMP() - (6 * 86400))),
 ',',
 (SELECT SUM(price) FROM orders WHERE time < (UNIX_TIMESTAMP() - (4 * 86400)) AND time > (UNIX_TIMESTAMP() - (5 * 86400))),
 ',',
 (SELECT SUM(price) FROM orders WHERE time < (UNIX_TIMESTAMP() - (3 * 86400)) AND time > (UNIX_TIMESTAMP() - (4 * 86400))),
 ',',
 (SELECT SUM(price) FROM orders WHERE time < (UNIX_TIMESTAMP() - (2 * 86400)) AND time > (UNIX_TIMESTAMP() - (3 * 86400))),
 ',',
 (SELECT SUM(price) FROM orders WHERE time < (UNIX_TIMESTAMP() - 86400) AND time > (UNIX_TIMESTAMP() - (2* 86400)) ),
 ',',
 (SELECT SUM(price) FROM orders WHERE time > (UNIX_TIMESTAMP() - 86400))
 ) as chart_rev 
FROM orders_basic
LIMIT 0,1

如果可能的话,我需要像这样以 24 小时为增量。

一如既往,我们非常感谢任何帮助。谢谢!

解决方案

请注意:仔细查看您的结果,它们可能存在,只是顺序错误,如果是,请反转您的排序。

SELECT GROUP_CONCAT(total_sum) AS sum_list FROM
(
    SELECT
        FLOOR((UNIX_TIMESTAMP() - time) / 86400) AS date,
        SUM(price) AS total_sum
    FROM
        orders_basic
    WHERE
        is_testorder < 1
          AND FROM_UNIXTIME(time) > DATE_SUB(NOW(), INTERVAL 1 WEEK)
    GROUP BY
        date
) AS s

【问题讨论】:

  • 首先我会尝试合并DATE_ADD() and INTERVAL,它更具可读性。然后我会在月份范围内尝试GROUP_CONCAT(),并按天数分组。
  • 感谢您向我们展示您的尝试,但是如果您向我们展示架构和您想要的输出会更容易。
  • @Marcus Adams,我确实解释了架构并说出了我想要的输出。我已经为你更清楚地格式化了。只有2列。我想要的一个例子是:1.01,3,2,4.23

标签: mysql database reporting google-visualization simplify


【解决方案1】:

可能是这样的吗?

SELECT GROUP_CONCAT(total_sum) AS sum_list FROM
(
    SELECT
        DATE(FROM_UNIXTIME(time)) AS date,
        SUM(price) AS total_sum
    FROM
        orders
    WHERE
        FROM_UNIXTIME(time) > DATE_SUB(NOW(), INTERVAL 1 MONTH)
    GROUP BY
        date
) AS s

这应该为您提供上个月销售总额的逗号分隔列表。但它会按日期分组,而不是 24 小时增量(根据time 列,截止日期为午夜)。

【讨论】:

  • 这对 Silver 很有帮助。谢谢!如果有人在我弄清楚之前没有在 24 小时内给我一个版本,我会给你答案。
  • @PolishHurricane 尝试用FLOOR((UNIX_TIMESTAMP() - time) / 86400) AS date 替换DATE(FROM_UNIXTIME(time)) AS date(保留最后的逗号)。这有点混乱,但这应该从运行的那一刻起以 24 小时为增量为您提供数据,最多向后 1 个月(因此您可能会获得 32 个条目,如果有问题,请相应地更改 INTERVAL 1 MONTH)。
  • 是的,这是一个很好的尝试,但它仍然失败 :( 我仍在试图弄清楚。我想我需要修改 WHERE 或 GROUPing。
  • 它是怎么失败的?我看到我更改了查询中的表名,例如,在我自己的一张表上测试它。它似乎在这里工作,除非我误解了你在找什么。
  • 抱歉,我看错了数据,你是个天才。我准备好了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-03-19
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
相关资源
最近更新 更多