2012-07-12 3 views
2

필자는 오랫동안 MySQL 쿼리를 작성해 왔지만 이것에 관해서는 완전히 초보자라고 느낍니다.이 쿼리를 단순화하는 방법을 찾지 못했습니다. 기본적으로 난 그냥 구글 차트에 연결되면 우리의 데이터베이스에서 수익의 쉼표로 구분 된 목록을 생성하려고 해요. 나는 "지난 31 일"을 위해 하나 만들어야 만합니다. 그래서 이것을 단순화하는 방법을 찾지 못하면 나는 다소 망가져 있습니다. 순서가 INT() (UNIX 타임 스탬프 형식) MySQL이 쿼리를 단순화합니까?

  • 가격에 왔을 때 : : 주문 소수점을 위해 얼마나 많은 (내 테이블에

    내 데이터베이스 열

    • 시간 ...이다 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 
    
  • +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

    +0

    당신이 시도한 것을 보여 주셔서 감사합니다. 그러나 우리가 스키마와 원하는 출력을 보여 주면 더 쉬울 것입니다. –

    +0

    @Marcus Adams, 나는 스키마를 설명하고 원하는 출력이 무엇인지 말했습니다. 나는 당신을 위해 더 명확하게 그것을 포맷했습니다. 열은 2 개뿐입니다. 내가 원하는 것의 예는 다음과 같습니다. 1.01,3,2,4.23 – PolishHurricane

    답변

    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

    이것은 매우 도움이되는은입니다. 감사! 나는 누군가가 나에게 그것을 얻기 전에 24 시간 단위로 버전을 얻지 못하면 답을 줄 것이다. – PolishHurricane

    +1

    @PolishHurricane'DATE (FROM_UNIXTIME (시간)) AS 날짜를'FLOOR ((UNIX_TIMESTAMP() - 시간)/86400) AS 날짜로 바꾸십시오 (끝 부분에 쉼표를 유지하십시오). 조금 지저분하지만,이 방법은 데이터가 실행 된 순간부터 최대 1 개월 후까지 24 시간 단위로 데이터를 제공해야합니다 (32 개 항목을 얻을 수 있으므로 문제가있는 경우 'INTERVAL 1 MONTH'를 적절히 변경하십시오) . – SilverSnake

    +0

    그래, 좋은 시도지만, 여전히 실패 : (나는 아직도 그것을 알아 내려고 노력하고있어. 내가 어디서 또는 GROUPING을 수정해야 할 것 같아요. – PolishHurricane

    관련 문제