|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2005 Messages : 35 ![]() |
salut tout le monde,
J'ai un petit problème ... j'ai une table `sac` avec dedans 2 collones `contenu_id` et `sac_id` je voudrai récupérer les identifiants des sacs contenant 1 et 2 et pas 3 pour la première partie c'est assez simple : Code :
Code :
il faudrait que la requète ne soit pas trop longe à exécuter (table assez chargée) Merci d'avance. |
||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 638 ![]() |
Bonjour,
Vous pourriez passer par le prédicat not exists pour faire votre test de non existance du contenu 3 sur vos sac. Sinon, si votre sgbd le supporte une jointure de type except. |
|
|
10
|
|
|
#3 | ||||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Apparemment, tu es sous MySQL, ce qui exclut EXCEPT et MINUS.
On pourrait le faire avec un NOT EXISTS, mais ça veut dire une sous-requête corrélée, et sous MySQL ça veut des performances catastrophiques. Du coup, il reste le NOT IN... Code :
Code :
|
||||
|
|
10
|
|
|
#4 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2005 Messages : 35 ![]() |
Il n'y a plus qu'a tester les deux méthodes,
je vous tiens au courrant |
|
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2005 Messages : 35 ![]() |
Alors,
les deux méthodes fonctionnent, niveau rapidité, je ferai les tests plus tard. juste pour vérification, si je remplace le : SELECT sac_id WHERE contenu_id = 3 par SELECT sac_id WHERE contenu_id IN (3,4,..) est-il préférable d'ajouter en plus un group by ? Merci d'avance. |
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Non, quelle drôle d'idée !
Le GROUP BY est utile avec des fonctions d'agrégation comme SUM ou COUNT placées dans le SELECT ou le HAVING, c'est tout. |
|
|
10
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2005 Messages : 35 ![]() |
la table étant grande, et le nombre de résultats répondant à la requète "SELECT sac_id WHERE contenu_id IN (3,4,..)" étant très important, cela ne ralentira-t-il pas la requète globale ?
pour : SELECT sac_id WHERE contenu_id IN (3,4,..) GROUP BY sac_id (valeurs très approximatives) nombre de résultats sans group by = (nombre de résultats avec group by)*1000 l'idée du select entre parenthèse est bien : - il va exécuter la requète entre parenthèses en premier - avec les résultats de la 1eère requète, il va construire la seconde puis l'exécuter ? |
|
|
00
|
|
|
#8 | ||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Citation:
Citation:
Mais de manière générale, il ne faut pas confondre le raisonnement logique pour produire le résultat et ce que fera vraiment l'optimiseur du SGBD. Je pourrais donc te répondre que c'est effectivement ce qui va se passer, mais que ce n'est pas "l'idée", parce que l'idée est juste de décrire le résultat qu'on veut obtenir et pas le processus d'obtention. |
||
|
|
10
|
|
|
#9 | ||
![]() ![]() |
On doit pouvoir économiser jointure et sous-requête en filoutant un peu :
Code :
__________________
Email : http://scr.im/waldar |
||
|
10
|
|
|
#10 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Joli !
|
|
|
10
|
|
|
#11 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2005 Messages : 35 ![]() |
|
|
|
00
|
|
|
#12 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Pas du tout, ces lignes-là seront éliminées par le HAVING sur max(contenu_id) < 3.
|
|
|
10
|
|
|
#13 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2005 Messages : 35 ![]() |
ah oui en effet, mais en fait les valeurs 1, 2 et 3 sont arbitraires,
je pourrait vouloir les sacs avec les objets 1, 3, 5 et 7 et sans le 2, 6 et 71... |
|
|
00
|
|
|
#14 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Dans ce cas, tu ne peux effectivement plus filouter
|
|
|
10
|
|
|
#15 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2005 Messages : 35 ![]() |
Dernières question :
- Est-ce que l'ordre des WHERE machin=truc AND hop=hop2 a une importance ? - Je sais par expérience (peut-être mauvaise) que les JOINs ont du mal à passer sur les clusters Mysql, la solution que tu m'as donné (Antoun) avec le JOIN serat-elle plus longue dans se cas ? (utilisation d'un cluster) |
|
|
00
|
|
|
#16 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Aucune importance pour la première question, aucune idée pour la seconde.
|
|
|
10
|
|
|
#17 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2005 Messages : 35 ![]() |
ok merci pour toutes ces infos !
Demain je poste le résultat de mes tests.. bonne fin de soirée. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com