|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
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 : Code :
Code :
J'espère que j'ai été assez clair et pas trop long ! Merci d'avance pour toute aide ! |
||||
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 669 ![]() |
bonjour,
Il faut remonter votre condition dans la clause where, sinon vous allez forcer des jointures internes. Essayez ceci : Code :
Pour la table afs_catart je déduis que la primary key est le couple {idart, idcat} ? Est-ce que votre colonne idcat2 de la table afs_categorie est indéxé ? |
||
|
|
00
|
|
|
#3 |
![]() ![]() |
Dans ta première requête, tu fais des jointures externes mais tu mets une condition dans le WHERE qui porte sur une table externe, transformant ainsi la jointure externe en jointure interne.
Lire mon billet de blog pour plus d'explications. Par contre j'ai du mal à comprendre ton besoin et à deviner la structure de tes tables au vu de la requête. Tu peux fournir ce qui manque pour qu'on puisse t'aider plus efficacement ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
La vache vous êtes rapide à répondre ! C'est moi qui suis à la bourre du coup !
![]() Donc pour ta requête punkoff, ça me donne une liste trop longue (130 articles au lieu de 125 000), avec pas mal de champs NULL : ID | Article | Telephone | Marque | Accessoire 1000 Bluetooth Mono sans fil HTC NULL NULL NULL 1000 Bluetooth Mono sans fil HTC NULL NULL NULL 1000 Bluetooth Mono sans fil HTC NULL NULL Bluetooth 1000 Bluetooth Mono sans fil HTC NULL NULL NULL 1000 Bluetooth Mono sans fil HTC NULL NULL NULL 1000 Bluetooth Mono sans fil HTC NULL NULL NULL 1000 Bluetooth Mono sans fil HTC NULL NULL NULL 1000 Bluetooth Mono sans fil HTC Z6 MOTOROLA NULL 1000 Bluetooth Mono sans fil HTC Z3 MOTOROLA NULL Et surtout je n'ai jamais à la fois le téléphone, la marque et l'accessoire sur la même ligne. Oui c'est bien le couple id_art/id_cat le primary key sur afs_catart, et ma colonne idcat2 sur afs_categorie n'est pas indexée... |
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 669 ![]() |
fournissez un jeu de donnée test + résutlat attendu + structure comme le suggère CinePhil
|
|
|
00
|
|
|
#6 | |||||
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
Citation:
Code :
J'ai essayé d'ajouter la ligne de punkoff, ce qui me donne le bon nombre de lignes, sans champs NULL... mais avec toujours le même type d'accessoire remonté ! Code :
id ARTICLE TELEPHONE MARQUE ACCESSOIRE 1000 Bluetooth Mono sans fil HTC Iolite T4242 HTC Bluetooth 1000 Bluetooth Mono sans fil HTC 6280 BLACKBERRY Bluetooth 1000 Bluetooth Mono sans fil HTC E60 NOKIA Bluetooth 1000 Bluetooth Mono sans fil HTC L600 SAMSUNG Bluetooth afs_article ID | DENOM afs_catart IDCAT | IDART afs_categorie ID | DENOM | IDCAT | IDCAT2 |
|||||
|
|
00
|
|
|
#7 | |
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
Citation:
Bref, si je corrige, j'ai des champs null dans la colonne accessoire. |
|
|
|
00
|
|
|
#8 | |
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
Citation:
Pour les structures de tables, vous avez besoin de quoi d'autre ? Pour le résultat attendu, et bien ce serait ça : id ARTICLE TELEPHONE MARQUE ACCESSOIRE 1000 Bluetooth Mono sans fil HTC T4242 HTC Bluetooth 1000 Bluetooth Mono sans fil HTC 6280 BLACKBERRY Bluetooth 1000 Bluetooth Mono sans fil HTC E60 NOKIA Bluetooth 1000 Bluetooth Mono sans fil HTC L600 SAMSUNG Bluetooth (...) 69 Adaptateur allume cigare HTC P3300 HTC Divers 69 Adaptateur allume cigare HTC MAX 4G HTC Divers 69 Adaptateur allume cigare HTC TYTN II HTC Divers 90 Adaptateur allume cigare Nokia 6310 NOKIA Divers 89 Adaptateur allume cigare Nokia X3 NOKIA Divers |
|
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
Si ça peut simplifier les choses, je n'ai pas forcément besoin du DENOM de la catégorie ACCESSOIRE.
Je peux récupérer simplement son ID, dans la table afs_catart. Mais bon... je sais pas si ça simplifie les choses... |
|
|
00
|
|
|
#10 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 669 ![]() |
Citation:
Non, pas suffisant, car votre résultat est incohérant par rapport à votre présentation. Dans votre 1er poste, j'ai simplement repris votre 2eme requête pour la joindre avec votre 1ere requête. Donc si la requête que je vous ai posté ne retourne que des valeurs null pour votre accessoire cela veut dire que votre 2eme requête initial ne renvoie rien. |
|
|
|
00
|
|
|
#11 | |||||
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
Citation:
Bon et bien on peut oublier cette deuxième requête. Bon on va reprendre autrement, si je fais (j'ai changé toutes mes jointures en internes... c'est ce qu'il me faut en fait non ?): Code :
id ARTICLE TELEPHONE MARQUE 1000 Bluetooth Mono sans fil HTC Desire Z HTC 1000 Bluetooth Mono sans fil HTC W980i SONY ERICSSON 1000 Bluetooth Mono sans fil HTC U900 LG (...) 1133 Vitre tactile Samsung S5600 Player Star SAMSUNG 1501 vitre tactile samsung s8000 je S8000 jet SAMSUNG 1515 Vitre tactile sony x10 X10 SONY ERICSSON 1517 Vitre tactile sony x10 mini X10 mini SONY ERICSSON Code :
id ARTICLE ACCESSOIRE 1000 Bluetooth Mono sans fil HTC Bluetooth 1848 lcd complet HTC Desire HD Pieces Detachees 1894 Vitre tactile Htc wildfire Pieces Detachees 75 Accès aux ports et au dock Housses |
|||||
|
|
00
|
|
|
#12 | ||
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
En fait, je ne sais pas si ça va aider encore, mais c'est ce genre de requête que j'aimerais faire... sauf que dans mon cas ça ne me retourne aucun enregistrement...
Code :
|
||
|
|
00
|
|
|
#13 |
![]() ![]() |
Vous n'avez toujours pas donné, table par table, les données sources et ce que vous attendez en sortie, comme demandé par Cinephil et Punkoff.
On peut continuer à jouer aux devinettes longtemps.
__________________
Email : http://scr.im/waldar |
|
10
|
|
|
#14 | |||||||
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
Et bien alors c'est moi qui ne comprend pas ce qu'il faut...
Ce que j'attends en sortie, je l'ai copié plus haut : Citation:
Qu'est-ce qu'il faut comme précisions supplémentaires ? Quant à mes données sources, on ne parle pas de la stucture, mais du contenu alors ? Donc dans ma table afs_article, j'ai ça : Code :
Code :
Code :
|
|||||||
|
|
00
|
|
|
#15 | |||
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
EDIT : Votre requête ne retourne rien parce que de la table C, vous tentez une jointure simultanée avec deux fois la même table sur la même colonne. Aucune ligne ne peut a priori avoir un idcat qui corresponde à simultanément un id de categorie ayant un idcat de 11 et un autre ayant un idcat de 12. Je me permet d'ailleurs de signaler que le nommage des colonnes prête hautement à confusion ! Quelque chose du genre (avant de regarder à faire de l'optimisation) vous renvoie-t-il des résultats corrects : Code :
|
|||
|
|
10
|
|
|
#16 | |
![]() ![]() |
Citation:
Pas en plus, plutôt en moins et en mieux. Un exemple cohérent entre quelques données sources pertinentes, vérifiables à l'œil et le résultat attendu. Si vous me parlez de l'article 2 dans la table article mais que je ne le retrouve pas dans la table catart, on ne peut rien en faire. Fournissez un jeu de test complet comme prévu dans les règles du forum, §5 : http://www.developpez.net/forums/a69...gage-sql-lire/ Notez que les données en elle-même n'ont pas à être forcément vos vraies données, il faut juste que la logique soit la même afin que vous puissiez derrière résoudre votre problème.
__________________
Email : http://scr.im/waldar |
|
|
00
|
|
|
#17 | |
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
Citation:
Et ça utilise plus de 800Mo de mémoire... |
|
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
J'ai édité mon post plus haut pour suggérer une requête.
Sur la question des perfs, il ya des index ? |
|
|
00
|
|
|
#19 | |||||||||
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
Citation:
afs_article Code :
Code :
Le téléphone X23 appartient à la marque Motorola (idcat2). Les téléphones Z8 et Z6 appartiennent à la marque Nokia. afs_catart Code :
L'article "Housse verte" est compatible avec tout sauf avec la catégorie "Coques". Ce que je souhaite obtenir : Code :
|
|||||||||
|
|
10
|
|
|
#20 | |||
|
Invité de passage
![]() Inscription : décembre 2004 Messages : 13 ![]() |
Citation:
Et donc on peut encore optimiser cette requête ? Parce que là elle est traitée en 0.0001 sec ! |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com