|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : décembre 2007 Messages : 18 ![]() |
Bonjour à tous,
j'ai une requete qui est : Code :
Code :
|
||||
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 654 ![]() |
Bonjour,
Vous ne pouvez pas l'optimiser. Le problème ici est votre modélisation qui est inadaptée. donc à partir de là... vous êtes obliger de faire des requêtes tordues pour répondre à votre besoin. Donc si vous changez un peu votre modélisation : Feuille-0,n----POSSEDE----1,1-Activité Avec entre autre : Feuille(feu_id, ...) Activite(act_id,#feu_id, act_valeur, act_ordre) On arrive à une requête plus simple : Code :
|
||
|
|
00
|
|
|
#3 | ||||
|
Membre émérite
![]() Adrien Développeur .NET Inscription : janvier 2007 Messages : 924 ![]() |
La modélisation se tient. Par contre pour la requête il y a mieux que une requete imbriquer.
Un truc du genre irait beaucoup plus vite: Code :
Code :
__________________
L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche) |
||||
|
|
00
|
|
|
#4 |
|
Membre régulier
![]() |
Bonjour,
En fait punkoff et mactwist69 te conseilles d'avoir deux tables. La table feuille1 Et une autre table activite avec l'id de feuille1, numéro d'activité(1,2,3,4,5...) et la valeur que tu recherches. ...Qui pourrait étendre le nombre d'activité possible ...activite6, .... au cas ou. Sinon essais un truc du genre: Code :
SELECT * FROM feuille1 WHERE activite_=1 OR activite_=2 |
|
|
00
|
|
|
#5 | |
|
Membre émérite
![]() Adrien Développeur .NET Inscription : janvier 2007 Messages : 924 ![]() |
Citation:
__________________
L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche) |
|
|
|
00
|
|
|
#6 | ||||||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 654 ![]() |
Citation:
Mise à part ça qu'est-ce qui motive le "mieux" dans votre argumentation ? (curiosité personnelle envers les mechanismes de MySql) Citation:
|
||||||
|
|
00
|
|
|
#7 | ||||
|
Membre émérite
![]() Adrien Développeur .NET Inscription : janvier 2007 Messages : 924 ![]() |
Cette réponse était basé sur le principe qu'il y a une nouvelle modélisation a deux table.
Je disai que ça: Code :
C'est mieux que ça: Code :
Passé par un INNER JOIN, donc en utilisant les index des clé primaires, pour faire le lien il ne va utiliser que les index, tandis que la condition se fera sur qu'une seule des deux requetes au select (donc une seule fois). J'ai proposer de mettre la condition dans le inner join (pour faire le where sur ce select), et j'ai proposer de la faire avec un Having, pour qu'il fasse la condition à la fin, sur le résultat, certe moins optimisé.
__________________
L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche) |
||||
|
|
00
|
|
|
#8 | |||
|
Membre régulier
![]() |
Citation:
Ici l'idée c'est une table activite: - 5 activité: numéro d'activité(1,2,3,4,5...) : act_ordre - peuvent prendre 1 ou 2 ou autre choses: la valeur : act_valeur - par feuille : l'id de la feuille qui fera liaison avec feuille : feu_id Et biensûre l'id unique d'activité: act_id Citation:
Et la table feuille ou t’enlève les champ activité: id de la feuille feu_id et le reste qui a dedans. Citation:
|
|||
|
|
00
|
|
|
#9 | |||||
|
Membre émérite
![]() Adrien Développeur .NET Inscription : janvier 2007 Messages : 924 ![]() |
Citation:
Car feuille possède les 5 colonnes: Activité 1, 2, 3, 4, 5. Tu voulais créer une table activité, pour factorisé. Mais ça sert à rien, y'a rien a factorisé. Car dans ce cas, au lieu de mettre Activité1=1, tu vas mettre Activité1= "l'id de l'activité 1", mais ça ne change pas que dans la table feuille, tu auras toujours 5 colonnes, pour mettre les 5 id de la table activité. De plus, en modélisation, c'est facile a voir: un lien: 0.n -- 1.1, fait que tout ce qu'il y a dans 1.1, tu peux le mettre dans la table 0.n. Donc... (c'est long je sais). Pour répondre à la question du début. le seule moyen de factorisé ta requete: est de faire Y'a rien de plus a faire.
__________________
L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche) |
|||||
|
|
00
|
|
|
#10 |
|
Membre régulier
![]() |
Et en fait je te proposai avec le underscore (_) si tu gardais la structure de ta table.
Mais je sais plus si ça fonctionne avec des noms de champ. activiteX Code :
SELECT * FROM feuille1 WHERE activite_ IN (1,2) |
|
|
00
|
|
|
#11 | |||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 654 ![]() |
Citation:
Puis dans la doc MySql : http://dev.mysql.com/doc/refman/5.0/...ubqueries.html etc Aurai-je loupé quelque chose ? Peut-être sur d'ancienne version de MySql est-ce le cas ? Citation:
Maintenant si on y réfléchi à deux fois, changeons un peu les besoins : - Retrouver les feuilles qui possèdent une ou plusieurs activités X - Retrouver les feuilles qui ne possèdent pas d'activité. - Retrouver les feuilles qui possèdent exactement l'activité X et Y - Retrouver les feuilles qui possèdent au moins les activités X, Y et Z - etc.. Tant de cas, simple au demeurant, qui deviennent vraiment complexe à traiter avec une telle structure initiale. edit: tiens sinon je ne suis pas d'accord avec mon 1er poste ! Citation:
Si c'est le cas ... Feuille-0,n----POSSEDE----0,n-Activité Deviendra en fait : Feuille(feu_id, ...) Activite(act_id, act_nom, ....) A_FEU_ACT(#feu_id, #act_id, fac_ordre, ...) Bien, si ça n'est pas le cas, on reste sur : Feuille-0,n----POSSEDE----1,1-Activité Qui se modélise par : Feuille(feu_id, ...) Activite(act_id,#feu_id, act_valeur, act_ordre) |
|||
|
|
10
|
|
|
#12 |
|
Membre émérite
![]() Adrien Développeur .NET Inscription : janvier 2007 Messages : 924 ![]() |
Pour la deuxième partie. Tu as raison. Ce qui m'avait échapper (je devrait lire plus
Mea Culpa donc. Sur la première partie... j'ai fait des explains de requêtes équivalente. Voici le résultat synthétisé: Avec exist - Exists utilise un type eq_ref pour la sous requête (rapide) - Mais cette requete n'est utile que si il n'y a pas de données à récupérer d'autre table que la première requete EDIT Avec jointure -> J'ai fait cette requete sur des tables MyIsam, donc forcement... - possibilité de rapatrié des données des deux tables. Donc dans notre cas, si tout ce qu'on veut est dans feuille, alors le exist est plus rapide. Second mea culpa
__________________
L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche) |
|
|
00
|
|
|
#13 | |
|
Membre émérite
![]() Adrien Développeur .NET Inscription : janvier 2007 Messages : 924 ![]() |
Citation:
Par contre, fac_ordre (de A_FEU_ACT) devra aussi etre clé primaire, sinon il y aura un seul couple feuille/act possible, et non pas les n voulus.
__________________
L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche) |
|
|
|
00
|
|
|
#14 | ||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 654 ![]() |
hmm, non.
Les n le seront mais dans ce sens : Code :
Si on veut pouvoir affecter plusieurs fois une même activité selon un ordre donné alors la modélisation change : Feuille-0,n--------POSSEDE--------0,n-Activite Ordre-0,n-------------| Par contre dans ce cas là la table "Ordre" n'est pas forcément nécessaire quand on passe au MPD ce qui peut effectivement entrainer une table d'association de ce type : A_FEU_ACT(#feu_id, #act_id, fac_ordre) |
||
|
|
00
|
|
|
#15 |
|
Membre régulier
![]() |
En fait on débat mais on ne sait même pas si on a répondu à la question de murdok74. Il n'a pas encore répondu.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com