Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4790 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  formulation du WHERE problematique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

formulation du WHERE problematique

n°1716631
danidan75
Posté le 12-04-2008 à 11:36:25  profilanswer
 

Bonjour
 
Pour résumer, je voudrais savoir les articles qui ne se sont pas vendus sur une période donnée.
 
Mes tables, simplifiées au maximum:
 
CREATE TABLE article (article_id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (article_id));
CREATE TABLE facture (facture_id INT NOT NULL AUTO_INCREMENT, facture_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (facture_id));
CREATE TABLE facture_ligne (facture_ligne_id INT NOT NULL AUTO_INCREMENT, fk_article_id INT NOT NULL, fk_facture_id INT NOT NULL, PRIMARY KEY (facture_ligne_id));
 
où la table facture_ligne renvoie aux données de article et facture.
 
En guise d'exemple:
 
1 enregistrement dans la TABLE article. Son article_id vaut 1
 
3 enregistrement dans la TABLE facture
(facture_id , facture_date)
(1 , 2007-01-01 00:00:00)
(2 , 2008-01-01 00:00:00)
(3 , 2008-01-15 00:00:00)
 
et enfin 3 enregistrement dans la TABLE facture_ligne
 
(facture_ligne_id , fk_article_id , fk_facture_id)
(1 , 1 , 1)
(2 , 1 , 2)
(3 , 1 , 3)
 
Si je fais un
 
SELECT article_id
FROM article
  LEFT JOIN facture_ligne ON fk_article_id = article_id
  LEFT JOIN facture ON facture_id = fk_facture_id
    AND facture_date  BETWEEN "2008-01-01 00:00:00" AND NOW()
WHERE facture_id IS NULL
 
je vais avoir un retour sur article 1, alors que j'ai eu des ventes sur 2008.
 
Il faut donc que je modifie cette requête pour qu'elle ne me renvoie l'article concerné que si AUCUN facture_id NOT NULL n'y est associé.
 
J'avoue caler.
 
Quelqu'un aurait-il la solution?

mood
Publicité
Posté le 12-04-2008 à 11:36:25  profilanswer
 

n°1716713
Leif Eriks​on
Guess I'm doing fine...
Posté le 12-04-2008 à 14:45:21  profilanswer
 

Etant donné qu'il existe au moins une ligne de facture qui n'est pas sur 2008, il est normal que ta requête retourne ton article n°1.
 
Pour récupérer tous tes articles qui n'ont pas eu de ventes sur 2008, il faut une requête différente, comme par exemple :
 

Code :
  1. SELECT article_id
  2. FROM article
  3. WHERE NOT EXISTS
  4. (
  5. SELECT 1
  6. FROM facture
  7. INNER JOIN facture_ligne
  8. ON facture_id = fk_facture_id
  9. WHERE facture_date BETWEEN "2008-01-01 00:00:00" AND NOW()
  10.   AND fk_article_id = article_id
  11. );



---------------
Il n'est qu'une seule chose qui excite les animaux plus que le plaisir, et c'est la douleur.
n°1716751
danidan75
Posté le 12-04-2008 à 15:53:19  profilanswer
 

Merci.
 
Problême: j'avais oublié de préciser que je suis en Mysql 4.0.2, donc incompatible avec les sous-requêtes.

n°1716755
weed
Posté le 12-04-2008 à 16:02:35  profilanswer
 

petit indice il va donc falloir passer par des requetes externes dans ce cas ...

n°1716864
Leif Eriks​on
Guess I'm doing fine...
Posté le 12-04-2008 à 22:52:03  profilanswer
 

Oui, requêtes externes dans ce cas ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  formulation du WHERE problematique

 

Sujets relatifs
WHERE NOT EXISTS.... huh ???[mysql] select from *2 tables* where *pas jointées*
[RESOLU] Ne compter dans classement seulement WHERE count > 5SQL WHERE MULTI REHCERCHE
insertion dans la base de donnée problèmatiquejointure dans le where ou dans le from
Utilisation requete php mysql contenant WHERE et AND[MySQL] clause WHERE avec AS
Comment intégrer des valeurs de liste dans ma clause WHERE ? :([SQL] Aide sur un WHERE
Plus de sujets relatifs à : formulation du WHERE problematique


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)