Problème dans mon where...

Problème dans mon where... - SQL/NoSQL - Programmation

Marsh Posté le 19-07-2013 à 17:13:29    

Bonjour à tous,
 
Je suis vraiment bloqué sur la requête $sql que voici:

Code :
  1. $data    = array();
  2. $xml = simplexml_load_string('<?xml version="1.0" encoding="utf-8"?><xml></xml>');
  3. // données de la table  
  4. $sql = "
  5. SELECT   
  6. produits.id_produit,
  7. MAX(produits_vente.date_) as last_vente,
  8. produits.libelle
  9. FROM 
  10. produits 
  11.  INNER JOIN produits_gamme ON produits.id_produits_gamme = produits_gamme.id_produits_gamme
  12.  INNER JOIN produits_type  ON produits.id_produits_type  = produits_type.id_produits_type
  13.  LEFT JOIN  produits_vente ON produits.id_produit        = produits_vente.id_produit
  14. WHERE YEAR(produits_vente.date_) = '2013'
  15. GROUP BY produits.id_produit
  16. ";
  17.  
  18. $data = array();
  19. $qry = mysql_query($sql);
  20. // ici on reconstruit les données de la table  
  21. while($row = mysql_fetch_assoc($qry)) {
  22.     $data[] = "
  23. <tr>
  24.     <td class='alignc'>".$row['id_produit']."</td>
  25.     <td class='alignr'>".$row['libelle']."</td>
  26.     <td class='alignc'>".$row['last_vente']."</td>
  27. </tr> ";
  28. }
  29.  
  30. $xml->addChild('table', implode("\n", $data)); 
  31. header('content-type: text/xml');
  32. echo $xml->asXML();


 
Voici la table "produits_vente":
id_produits_vente     date_         id_produit
1                          2014-04-03          1
2                          2013-08-05          3
3                          2012-09-04          2
4                          2012-10-01          2
5                          2013-08-06          1
 
Le problème est que ma requête $sql va bien rechercher les produits et dates de 2013, mais je voudrais que , pour chaque id_produit, sortent uniquement les dates de 2013, pour autant qu'il n'y ait pas de date supérieure. Or ici, pour l'id_produit 1, il y en a une en 2014. Donc seule la date du 2013-08-05 devrait sortir pour l'article 3, mais celle du 2013-08-06 sort également pour l'article 1.
 
Comment puis-je éviter ça?
 
merci d'avance!!!!!!!

Reply

Marsh Posté le 19-07-2013 à 17:13:29   

Reply

Marsh Posté le 19-07-2013 à 17:47:00    

Bonjour !
 
Je pense que votre where est mal placé car vous exécutez d'abord la clause where, ce qui vous renvoie donc les deux dates de 2013 pour les id_produit 1 et 3, puis ensuite votre max.
 
Si vous remplacez le YEAR(produits_vente.date_) par YEAR(last_vente), cela marche ? (Je n'ai pas de serveur sous la main pour tester).  
 
Sinon, faites une sous-requête qui ne vois renvoie que les id_produits dont la dernière vente est en 2013, puis faites un produits.id_produits in (la requête) au lieu de faire une jointure (mais j'ai du mal à estimer la charge que cela va entraîner).
 
Bonne continuation !

Reply

Marsh Posté le 19-07-2013 à 18:08:45    

Merci Farian,
 
Si je remplace le YEAR(produits_vente.date_) par YEAR(last_vente) ca ne fonctionne pas.  Pour être sûr: YEAR(MAX(produits_vente.date_)) non plus.  
 
Le problème est que j'ai besoin de ma jointure avec LEFT car il peut ne pas y avoir de date_ correspondante dans la table...  
 
A moins que je n'aie pas bien compris la sous-requête dont vous me parlez...
 
Il n'y a alors pas de solution possible? :(

Reply

Marsh Posté le 19-07-2013 à 19:02:07    

Je n'arrive pas à écrire la sous requête. Pourriez vous me donner une piste svp.

Reply

Marsh Posté le 19-07-2013 à 20:18:07    

Je n'ai rien pour tester la requête, mais j'aurais remplacé la jointure sur la table par un "where produits.id_produit in (select id_produit from id_produits_vente where YEAR(MAX(produits_vente)) = '2013')
 
Mais en l'écrivant, je ne suis pas sûr que cela marche ... Mais c'est l'idée ...
 
Je laisse la main aux vrais experts du SQL :)

Reply

Marsh Posté le 20-07-2013 à 11:40:36    

Farian a écrit :

Je n'ai rien pour tester la requête, mais j'aurais remplacé la jointure sur la table par un "where produits.id_produit in (select id_produit from id_produits_vente where YEAR(MAX(produits_vente)) = '2013')
 
Mais en l'écrivant, je ne suis pas sûr que cela marche ... Mais c'est l'idée ...
 
Je laisse la main aux vrais experts du SQL :)


 
Au secours les gars, ça ne fonctionne pas. Je désespère.
Voilà ce que j'ai fait:

Code :
  1. $sql = "
  2. SELECT   
  3. produits.id_produit,
  4. MAX(produits_vente.date_) as last_vente,
  5. produits.libelle
  6. FROM 
  7. produits 
  8. WHERE produits.id_produit IN (SELECT produits_vente.id_produit from produits_vente WHERE YEAR(MAX(produits_vente.date_)) = '2013')
  9. GROUP BY produits.id_produit
  10. ";


 
Merci d'avance pour votre aide si précieuse...

Reply

Marsh Posté le 21-07-2013 à 23:20:31    

utilise un HAVING(MAX(xxx)) à la place du where
 

Code :
  1. SELECT 
  2. produits.id_produit,
  3. MAX(produits_vente.date_) as last_vente,
  4. produits.libelle
  5. FROM
  6. produits
  7. INNER JOIN produits_gamme ON produits.id_produits_gamme = produits_gamme.id_produits_gamme
  8. INNER JOIN produits_type  ON produits.id_produits_type  = produits_type.id_produits_type
  9. LEFT JOIN  produits_vente ON produits.id_produit        = produits_vente.id_produit
  10. GROUP BY produits.id_produit, produits.libelle
  11. HAVING YEAR(MAX(produits_vente.date_)) = '2013'


Message édité par deliriumtremens le 21-07-2013 à 23:21:02
Reply

Marsh Posté le 22-07-2013 à 23:16:51    

deliriumtremens, tu es mon sauveur! :)
Un immense merci.
J'avais bien testé ça avant, mais j'avais placé le HAVING avant le GROUP BY, et là, rien ne fonctionne.
Merci merci merci!!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed