2012-07-12 108 views
2

我一直在写MySQL查询很长一段时间,但我完全感觉像一个新手当谈到这一点,我似乎无法弄清楚如何简化这个查询。基本上我只是试图从我们的数据库中产生一个逗号分隔的收入清单,最终被插入谷歌图表。我必须为“过去31天”做一个,所以我有点拧,除非我想出如何简化这个。在我的表MySQL简化查询?

我的数据库列...

  • 时间:当订单进来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个小时为单位这样。

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

SOLUTION

请注意:你的结果仔细一看,他们可能有,只是在错误的顺序,如果是这样,扭转你的排序。

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 
+0

首先我会尝试引入['DATE_ADD()'和'INTERVAL'(http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-添加)这是更可读。然后,我会在月份范围内尝试使用['GROUP_CONCAT()'](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat)天数。 – mellamokb 2012-07-12 13:31:46

+0

感谢您向我们展示您尝试过的内容,但如果您向我们展示了架构和所需的输出,则会更容易。 – 2012-07-12 13:32:02

+0

@Marcus Adams,我解释了模式并说出我想要的输出是什么。我已经更清楚地为你格式化了它。只有2列。我想要的一个例子是:1.01,3,2,4.23 – PolishHurricane 2012-07-12 14:03:39

回答

3

也许这样的事情?

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专栏,截止时间将为午夜)。

+0

这对Silver很有帮助。谢谢!如果有人在24小时之内没有给我一个版本,我会给你答案。 – PolishHurricane 2012-07-12 14:08:30

+1

@PolishHurricane尝试用'FLOOR((UNIX_TIMESTAMP() - time)/ 86400)AS date'(保留逗号结束)替换'DATE(FROM_UNIXTIME(time))AS date'。这有点麻烦,但是这应该从运行的那一刻起以24小时为单位给你提供数据,最多1个月倒退(所以你可能会得到32个入口,如果这是一个问题,则更改'INTERVAL 1 MONTH') 。 – SilverSnake 2012-07-12 14:24:45

+0

是的,这是一个很好的尝试,但它仍然失败:(我仍然试图弄清楚,我想我需要修改WHERE或GROUPING。 – PolishHurricane 2012-07-12 14:45:20