formulation du WHERE problematique

formulation du WHERE problematique - SQL/NoSQL - Programmation

Marsh Posté le 12-04-2008 à 11:36:25    

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?

Reply

Marsh Posté le 12-04-2008 à 11:36:25   

Reply

Marsh Posté le 12-04-2008 à 14:45:21    

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.
Reply

Marsh Posté le 12-04-2008 à 15:53:19    

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

Reply

Marsh Posté le 12-04-2008 à 16:02:35    

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

Reply

Marsh Posté le 12-04-2008 à 22:52:03    

Oui, requêtes externes dans ce cas ;)

Reply

Sujets relatifs:

Leave a Replay

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