Bonjour à tous,
Je tâtonne avec l'utilisation des jointures.
Et aujourd'hui je cherche à simplifier deux requêtes que j'utilise.
Voilà mon cas :
- J'ai une table "articles"
- une table "categories"
- une table "catart" (qui lie les articles aux catégories - un article peut appartenir à plusieurs catégories : deux colonnes : idcat | idart)
Je dois sortir un listing d'articles avec différents champs, notamment toutes les catégories dans lesquelles l'article apparait.
J'ai plusieurs types dans ma table categories :
- marques (idcat=10)
- accessoires (idcat=12)
- telephones (idcat=11)
Pour compliquer l'affaire, ma catégorie "telephones" est elle même liée à la catégorie "marques" : Exemple: un téléphone "N86" est de marque "Nokia" (dans ma table le "N86" a donc pour "idcat" = 11 et pour "idcat2" = 10)
Et moi je dois sortir :
Article1 | Batterie | Nokia | N86
Article1 | Batterie | HTC | Legend
Article2 | Coque | Samsung | Galaxy SII
etc.
A l'heure actuelle j'utilise donc deux requêtes sans doute archaïques, mais qui ont le mérite de fonctionner... mais qui me prennent un max de ressources et de temps d'exécution.
Je fais donc d'abord :
Mais je dois encore aller chercher ma catégorie "accessoires", et c'est pour elle que je butte... Donc pour le moment j'ai cette solution - de bourrin - de lancer ma boucle sur ma première requête, et d'aller pour chaque ligne chercher le type d'accessoires d'appartenance :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT A.id, A.denom as ARTICLE, B.denom as TELEPHONE, D.denom as MARQUE FROM afs_article A LEFT JOIN afs_catart C ON A.id=C.idart LEFT JOIN afs_categorie B ON B.id=C.idcat LEFT JOIN afs_categorie D ON B.idcat2=D.id WHERE B.idcat=11 ORDER BY ARTICLE
Et donc ma question est évidemment : comment faire ça en une seule requête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT K.id as ACCESSOIRES FROM afs_catart J LEFT JOIN afs_categorie K ON K.id=J.idcat WHERE J.idart=$IDARTICLE AND K.idcat=12
J'espère que j'ai été assez clair et pas trop long !
Merci d'avance pour toute aide !
Partager