[SQL] Requête multi-tables + DISTINCT ...

Requête multi-tables + DISTINCT ... [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 13-02-2006 à 21:46:27    


Boujour :)
 
Bon je suis pas très callé en requetes sql, et là je commence à bloquer sur les requêtes complexes, alors je vous demande de l'aide. :)
 
 
 
J'ai 2 tables :
 
 
liaison_cat_prod

---------------------
| prod_id  |  cat_id |
---------------------
|  19      |  300213 |
|  12      |  300501 |
| 845      |  300503 |
|   1      |  300504 |
| 845      |  300504 |
| 843      |  300504 |
|  18      |  300504 |
----------------------


 
produits

---------------------------------------------
|  id    |         libel   |    description |
---------------------------------------------
|   1    |     produits1   |    description |
|  12    |    produits12   |    description |
|  18    |    produits18   |    description |
|  19    |    produits19   |    description |
| 843    |   produits843   |    description |
| 845    |   produits845   |    description |
---------------------------------------------


 
 
 
Mon problème est que j'aimerai afficher les produits de la catégorie "3005" (donc contenant les sous catégories 300501,300502,etc...) sans avoir de doublons, c'est à dire en affichant 1 seul fois le produit qui pourrai se trouver dans plusieurs catégories (voir le produit 845).
 
Voici la requete que j'ai :

SELECT DISTINCT produits.id,produits.libel,produits.description,liaison_cat_prod.cat_id
    FROM produits,liaison_cat_prod
    WHERE liaison_cat_prod.cat_id LIKE '".$cat."%'
          AND produits.id=liaison_cat_prod.prod_id
          AND produits.actif='1'
    ORDER BY liaison_cat_prod.cat_id ASC LIMIT 20


 
Mais le DISTINCT ne marche et celà m'affiche 2 fois le produits 845 ...  
Comment puis-je y remédier ?
J'essayer de le faire en 2 requete pour voiri, mais j'aurai préféré le faire en  1 seule requete ... :/
 
Merci de votre aide :jap:
 
Au passage, auriez-vous un site ou un tutoriel sur les requêtes complexe ? :)
 
 
 
 
 
 


---------------
flick r
Reply

Marsh Posté le 13-02-2006 à 21:46:27   

Reply

Marsh Posté le 13-02-2006 à 22:11:44    

Le problème est dans la requête et le distinct
 

Citation :


SELECT DISTINCT produits.id,produits.libel,produits.description,liaison_cat_prod.cat_id
    FROM produits,liaison_cat_prod  
    WHERE liaison_cat_prod.cat_id LIKE '".$cat."%'  
          AND produits.id=liaison_cat_prod.prod_id  
          AND produits.actif='1'  
    ORDER BY liaison_cat_prod.cat_id ASC LIMIT 20


 
Le Cat_Id étant différent pour chaque ligne 845 (300503 ou 300504), le résultat te ramene autant de lignes que Cat_Id
=> il te suffit de retirer le Cat_Id de ta requete.


Message édité par chris500 le 13-02-2006 à 22:12:28
Reply

Marsh Posté le 13-02-2006 à 22:15:39    

L'attribut DISTINCT concerne la ligne constituée par toutes les colonnes qui sont recherchées. Il ne concerne pas que la première colonne. Le problème ici, c'est la colonne cat_id qui peut prendre deux valeurs différentes, donc, forcément, la requête considèrera que le résultat contient deux lignes différentes qui seront :

845, produits845, description, 300503
845, produits845, description, 300504

Pour n'avoir qu'une seule ligne, il faut faire la même requête sans demander cat_id.
Ou bien adapter la requête pour n'avoir qu'un seul cat_id, par exemple prendre le plus petit quand il y a en plusieurs avec :

SELECT DISTINCT produits.id,
                produits.libel,
                produits.description,
                min(liaison_cat_prod.cat_id)  
    FROM produits,liaison_cat_prod  
    WHERE liaison_cat_prod.cat_id LIKE '".$cat."%'  
          AND produits.id=liaison_cat_prod.prod_id  
          AND produits.actif='1'  
    GROUP BY produits.id,
             produits.libel,
             produits.description
    ORDER BY liaison_cat_prod.cat_id ASC LIMIT 20
 

Edit : Chris500 a été plus rapide, bravo !


Message édité par olivthill le 13-02-2006 à 22:18:43
Reply

Marsh Posté le 13-02-2006 à 22:35:43    


Génnialll !! Merciiii à vous deux :jap:
 


---------------
flick r
Reply

Sujets relatifs:

Leave a Replay

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