2011-08-25 4 views
0

J'ai presque terminé ma requête, mais il reste un dernier problème à résoudre. Ma requête ressemble à ceci:MYSQL Limiter les résultats

//execute the SQL query and return records 
$result = mysql_query("SELECT SUM(ps_order_detail.product_weight) * IF(COUNT(ps_order_detail.id_order_detail) > 50, 1.2, 1) 
as total_provision, COUNT(ps_order_detail.id_order_detail) as antal_ordrar, ps_customer.firstname 
        FROM ps_order_detail 
        JOIN ps_orders ON ps_order_detail.id_order = ps_orders.id_order 
        JOIN ps_order_history ON ps_orders.id_order = ps_order_history.id_order 
        JOIN ps_customer ON ps_orders.id_customer = ps_customer.id_customer 
        WHERE MONTH(ps_order_history.date_add) = MONTH(CURDATE()) AND (ps_order_history.id_order_state) = '4' OR (ps_order_history.id_order_state) = '13' 
        GROUP BY ps_orders.id_customer 
        ORDER BY SUM(ps_order_detail.product_weight) DESC 

"); 


echo "<br>"; 
echo ("<img src=chart.php>"); 
echo "<br>"; 
echo ("<img src=chart_prov.php>"); 

//fetch tha data from the database 
while ($row = mysql_fetch_array($result)) 
{ 
    echo '<font size="3">'; 
    echo " Namn: ".$row{'firstname'}. ""; 
    echo " Provision: ".$row{'total_provision'}. ""; 
    echo " Abonnemang: ".$row{'antal_ordrar'}. ""; 
    echo '<br>'; 
    echo '</font size>'; 
} 

Cette partie:

AND (ps_order_history.id_order_state) = '4' OR (ps_order_history.id_order_state) = '13' 

provoque le résultat à afficher si l'état des commandes est 4 ou 13. Le problème est que dans le back-end je peux mettre dans ces états plusieurs fois, donc si je ne suis pas prudent lors de la mise à jour des commandes, il va ajouter les résultats plus d'une fois.

Est-ce un moyen de limiter cette fonction à la dernière mise à jour (avec date_add dans la même table) ou à la limite de 1?

+1

Je ne comprends pas ce que vous essayez de dire (où sont les instructions de mise à jour?), Mais vous devriez vérifier vos parenthèses dans la clause WHERE (peut-être en ajouter autour de la partie OR). – Olaf

Répondre

0

Essayez d'utiliser

SELECT SUM(ps_order_detail.product_weight) * IF(COUNT(ps_order_detail.id_order_detail) > 50, 1.2, 1) 
as total_provision, COUNT(ps_order_detail.id_order_detail) as antal_ordrar, ps_customer.firstname 
       FROM ps_order_detail 
       JOIN ps_orders ON ps_order_detail.id_order = ps_orders.id_order 
       JOIN ps_order_history ON ps_orders.id_order = ps_order_history.id_order     
       JOIN ps_customer ON ps_orders.id_customer = ps_customer.id_customer 
       WHERE ps_order_history.id = (select ps_order_history.id from ps_order_history where ps_orders.id_order = ps_order_history.id_order and MONTH(ps_order_history.date_add) = MONTH(CURDATE()) AND (ps_order_history.id_order_state) = '4' OR (ps_order_history.id_order_state) = '13' order by ps_order_history.date_add desc limit 1) 
       GROUP BY ps_orders.id_customer 
       ORDER BY SUM(ps_order_detail.product_weight) DESC 

Peut-être que ça aide.

+0

Hmm qui a rendu le résultat encore plus élevé que prévu. – HangerS

+0

La limite fonctionne comme prévu mais il semble que cela totalise des totaux et aucun mois courant – HangerS

+0

Essayez la version éditée mais je ne sais pas quel est le nom de l'ID dans ps_order_history. J'utilise le nom d'identifiant. –

Questions connexes