2012-07-12 5 views
2

J'ai écrit des requêtes MySQL depuis longtemps, mais je me sens totalement comme un novice quand il s'agit de cela et je n'arrive pas à comprendre comment simplifier cette requête. Fondamentalement Je suis juste en train d'essayer de générer une liste de revenus délimités par des virgules de notre base de données qui finit par être branché sur Google Maps. Je dois en faire un pour "les 31 derniers jours" aussi, donc je suis un peu foutu à moins que je ne comprenne comment simplifier cela.MySQL Simplifier cette requête?

Mes colonnes de base de données dans ma table sont ...

  • temps: Quand l'ordre est venu int() (format d'horodatage UNIX)
  • prix: Dans quelle mesure l'ordre était pour décimal (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 

Si possible, je besoin par incréments de 24 heures comme celle-ci.

Comme toujours, toute aide est très appréciée. Merci!

SOLUTION

S'il vous plaît noter: Regardez attentivement vos résultats, ils peuvent être là, juste dans le mauvais ordre, le cas échéant, inverser votre tri.

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

D'abord j'essaierais d'incorporer ['DATE_ADD()' et 'INTERVAL'] (http://dev.mysql.com/doc/refman/5.1/fr/date-and-time-functions.html#function_date- ajouter) qui est plus lisible. Ensuite, je voudrais essayer un ['GROUP_CONCAT()'] (http://dev.mysql.com/doc/refman/5.0/fr/group-by-functions.html#function_group-concat) sur la plage du mois et le groupe par le numéro du jour. – mellamokb

+0

Merci de nous avoir montré ce que vous avez essayé, mais ce serait plus simple si vous nous montriez le schéma et la sortie désirée. –

+0

@Marcus Adams, j'ai expliqué le schéma et dire quelle est ma sortie désirée. Je l'ai formaté plus clairement pour vous. Il n'y a que 2 colonnes. Un exemple de ce que je veux serait: 1.01,3,2,4.23 – PolishHurricane

Répondre

3

Quelque chose comme ça peut-être? Cela devrait vous donner une liste de sommes vendues le mois dernier, séparées par une virgule. Mais il sera groupé sur la date, pas par incréments de 24 heures (donc la coupure sera minuit, selon la colonne time).

+0

Ceci est très utile Silver. Merci! Je vais vous donner la réponse si quelqu'un ne m'apporte pas une version par incrément de 24 heures avant que je la devine. – PolishHurricane

+1

@PolishHurricane Essayez de remplacer 'DATE (FROM_UNIXTIME (heure)) AS date' par' FLOOR ((UNIX_TIMESTAMP() - heure)/86400) AS date' (gardez la virgule à la fin). C'est un peu brouillon, mais cela devrait vous donner les données par incréments de 24 heures à partir du moment où il est exécuté, jusqu'à 1 mois en arrière (donc vous pouvez obtenir 32 entrées, changer en conséquence INTERVALLE 1 mois si c'est un problème) . – SilverSnake

+0

Ouais c'est un bon essai, mais il échoue toujours :(J'essaie toujours de comprendre.Je pense que je dois modifier le WHERE ou GROUPING – PolishHurricane