2010-12-02 2 views
0

Je vais sauter le "pourquoi" pour la brièveté. Mais si vous voulez savoir, vous pouvez demander. Mais fondamentalement, ma première quête a été de trouver un moyen de compter toutes les lignes antérieures au mois en cours. J'ai trouvé la solution à ce qui fonctionne, ce qui est:Vous cherchez une requête mysql pour compter toutes les lignes précédentes au mois dernier

SELECT COUNT(*) FROM myTable 
WHERE log_date < (CURDATE() - DAYOFMONTH(CURDATE())) 

je soustrais seulement le nombre de jours qui a transpiré ce mois-ci et compte toutes les lignes avec la date de moins que le premier jour de ce mois.

Le prochain problème est que j'ai besoin de compter toutes les lignes avant le mois dernier. Je suppose que techniquement, je pourrais prendre mon résultat ci-dessus et interroger les résultats du mois dernier et soustraire les deux requêtes. Mais j'espérais une seule requête pour cela. J'ai variations essayé des deux versions ci-dessous:

SELECT COUNT(*) FROM myTable 
WHERE log_date < ((CURDATE()- DAYOFMONTH(CURDATE())) - INTERVAL 1 MONTH) 

et

SELECT COUNT(*) FROM myTable 
WHERE log_date < DATE_SUB((CURDATE()- DAYOFMONTH(CURDATE())), INTERVAL 1 MONTH) 

Ces deux approches ainsi que quelques variantes de ce que j'ai rendement essayé résultat de 0 quand je sais que la réponse devrait être 14.

Y at-il un moyen d'obtenir la réponse que je recherche dans une seule requête?

Merci.

Répondre

0

Essayez ceci:

SELECT COUNT(*) FROM `myTable` WHERE `log_date` BETWEEN "2010-11-01 00:00:00" AND "2010-11-30 23:59:59" 
+0

Ceci est une approche intéressante. Cela m'a donné une idée. Puisqu'il n'y a aucun enregistrement avant une certaine date, je pourrais employer comme date de début quelque chose comme '2010-01-01' et alors juste devoir manipuler la date de fin. Mais puisque cela sera utilisé dans une boucle, je dois être capable de manipuler la date de fin avec une variable. C'est pourquoi l'utilisation d'une variante de «INTERVAL 1 MOIS» serait si utile. Je pourrais changer cet intervalle en n'importe quoi. – astonishedman

0

Ok, je pense que je reçois ce que vous voulez.

Vous avez 2 dates et vous voulez le COUNT pour les enregistrements avant chaque date.

SELECT 
SUM(IF(log_date<DATESUB(CURDATE()-DAYOFMONTH(CURDATE())), 1, 0)) AS LAST_MONTH, 
SUM(IF(log_date<DATE_SUB((CURDATE()-DAYOFMONTH(CURDATE())),INTERVAL 1 MONTH),1,0) 
AS PREV_MONTH 
FROM .... 
WHERE log_date < DATESUB(CURDATE() - DAYOFMONTH(CURDATE())); 

De cette façon, vous avez 2 émulé COUNT s en utilisant SUM combiné avec IF.

Je suppose que vous utilisez MySQL mais cela pourrait fonctionner sur d'autres SGBD

Hope this helps!

+0

J'aime ça et je voulais vraiment que ça marche. Je reçois une erreur de syntaxe sur cette première partie "SUM (IF ...LAST_MONTH, "quand j'enlèverai cela, il faudra compter sur le second, mais la réponse est" 0 "comme dans les requêtes que j'ai construites, est-ce possible qu'il ne compte que les lignes du mois précédent? , parce que la réponse à cela serait «0», mais j'en ai besoin pour compter tous les mois précédents – astonishedman

+0

J'ai corrigé la première ligne, elle n'avait pas besoin du DATE_SUB sur cette SUM parce qu'il n'y avait pas de facteurs à soustraire. le LAST_MONTH est correct (36), mais PREV_MONTH devrait renvoyer 14 et retourner 0. – astonishedman

+0

J'ai réduit ce qu'il n'aime pas Si je sors "-DAYOFMONTH (CURDATE())" ça compte correctement pour ce cas. renvoie 14. Mais si je comprends bien, sans cela, il comptera tout ce qu'il y a avant il y a un mois, il ne faut compter que tout ce qui précède le premier du mois dernier, alors y a-t-il une autre façon de le faire? – astonishedman

0

J'ai trouvé la solution. Merci goreSplatter et ajreal et dcestari pour votre contribution et m'aider à y réfléchir. Voici la requête de travail:

$query = mysql_query("SELECT SUM(IF(log_date<(CURDATE()-DAYOFMONTH(CURDATE())),1,0)) AS LAST_MONTH, SUM(IF(log_date<DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)), INTERVAL 1 DAY),1,0)) AS PREV_MONTH FROM myTable WHERE member_id = '$mid'")or die(mysql_error());

Pour le calcul PREV_MONTH je suis retourné deux mois, a obtenu le dernier jour de ce mois et a ajouté un jour pour obtenir le premier jour du mois dernier. On dirait que s'ils ont un "LAST_DAY", ils auront aussi une fonction "FIRST_DAY".

Espérons que cela servira à aider quelqu'un sur la route.

Questions connexes