2010-04-08 6 views
1

Quel est le moyen le plus efficace de faire cela?Sélectionnez les statistiques de différents jours

En ce moment je suis en train de faire ce de cette façon ..

$m= date("m"); 
$de= date("d"); 
$y= date("Y"); 
$userid = $_SESSION['user_id']; 
//today 
$date = date("Y-m-d"); 
$today = mysql_query("SELECT * 
         FROM cdr 
         WHERE accountcode = '$userid' 
         AND calldate LIKE '$date%'") or die(mysql_error()); 
$counttoday = mysql_num_rows($today); 
//yesterday 
$yesterdaydate = date('m/d/Y', mktime(0,0,0,$m,($de-1),$y)); 
$yesterday = mysql_query("SELECT * 
          FROM cdr 
          WHERE accountcode = '$userid' 
          AND calldate LIKE '$yesterdaydate%'") or die(mysql_error()); 
$countyesterday = mysql_num_rows($yesterday); 

puis

print $counttoday; 
print $countyesterday; 

Je sais qu'il doit y avoir une meilleure façon de le faire. Faites-moi savoir, merci!

+0

Avez-vous seulement besoin de la valeur de mysql_num_rows() ou est-ce que vous _fetch_ tous ces enregistrements de toute façon? – VolkerK

Répondre

-1

Je ne sais pas si cela est une meilleure manière absolue de faire ce que vous essayez de faire, mais vous pouvez utiliser l'instruction MySQL COUNT() pour compter le nombre de lignes renvoyées par une requête.

Ainsi, par exemple, l'écriture

SELECT COUNT(*) 
FROM cdr 
WHERE accountcode = '$userid' 
AND calldate LIKE '$date%' 

retourne une table 1x1 des résultats avec le nombre de lignes dans la requête. Ensuite, vous pouvez utiliser

$counttoday = mysql_result($today, 0); 

pour aller chercher le comte.

Il ne semble pas y avoir un moyen plus rapide de le faire avec un appel de fonction, sauf si vous définissez votre propre fonction, je suppose. Mais pour un très gros résultat de votre requête initiale, j'imagine que c'est plus rapide puisque je suppose que mysql_num_rows() doit encore compter chaque ligne individuellement. Le faire de cette façon ne passe qu'une fois sur les lignes du résultat de la requête, lorsque le résultat lui-même est rempli.

0

wouldnt ce travail?

SELECT calldate, COUNT(calldate) FROM cdr WHERE accountcode = '$userid' AND (calldate LIKE '$today%' OR calldate LIKE '$yesterday%') 
0

pourquoi aujourd'hui Y-m-d alors qu'hier est m/d/Y?

$yesterdaydate = date('Y-m-d', strtotime('-1 day')); 

calldate dans la table doit être daté ou datetime. Ensuite, vous pouvez simplement utiliser

SELECT DATE_FORMAT(calldate, '%Y-%m-%d') `calldate`, COUNT(calldate) `count` FROM cdr WHERE accountcode = '$userid' AND calldate >= '$yesterdaydate' group by calldate 

Vous pouvez comparer calldate à yesterdaydate $ pour savoir si elle est ou hier d'aujourd'hui compte.

0

Comme les autres réponses ne mentionnent pas, il peut effectivement être fait en une seule requête, comme suit:

$today = date('Y-m-d'); 
$yesterday = date('Y-m-d', strtotime('yesterday')); 

$mysql_query("SELECT COUNT(DATE(`calldate`) = '$today') `today`, 
    COUNT(DATE(`calldate`) = '$yesterday') `yesterday` 
    FROM `cdr` 
    WHERE `accountcode` = '$userid' 
     AND DATE(`calldate`) IN ('$today', '$yesterday')"); 

Cela retourne le compte aujourd'hui dans la première colonne et le nombre d'hier la deuxième colonne.

Si calldate est déjà un champ DATE, vous pouvez ignorer le cast DATE(); cela améliorerait la performance en fait.

Questions connexes