WHERE avec NOT IN [MySQL] - SQL/NoSQL - Programmation
Marsh Posté le 19-11-2004 à 11:52:58
ReplyMarsh Posté le 19-11-2004 à 12:13:10
Il me semble que ça fonctionne avec les versions >= 4.
En passant en général il vaut mieux éviter les NOT IN.
Marsh Posté le 19-11-2004 à 12:46:20
krolours1 a écrit : Il me semble que ça fonctionne avec les versions >= 4. |
ah, pourquoi? Ca prend trop de temps d'exécution?
Pour remplacer where val1 not in (val2, val3, ...), j'aurais fait un where ((val1 <> val2) AND (val1 <> val3) AND ...). Mais c'est clair que c'est pas génial ... et on peut virer certaines ()
Marsh Posté le 19-11-2004 à 15:14:44
NOT IN est à proscrire quand il est évitable parceque :
1/ C'est infiniment plus long que toutes les autres méthodes (saus des <> à la queue leue leue )
2/ Tu es limité en nombre d'éléments présents dans le NOT IN
Débrouille-toi pour faire ça en utilisant une jointure, ça sera plus rapide, et tu n'auras plus de limitation.
Marsh Posté le 19-11-2004 à 15:15:21
Ceci dit, comprends pas... "val2, val3, ..." c'est quoi ? des valeurs ou des colonnes ?
Marsh Posté le 19-11-2004 à 15:23:25
désolé, j'ai vraiment appelé mes champs n'importe comment.
val1 est un champ de la base (une colonne) alors que val2 et val3 sont des valeurs que peut prendre le champ val1...
Marsh Posté le 19-11-2004 à 15:24:42
Arjuna a écrit : NOT IN est à proscrire quand il est évitable parceque : |
ah? le not in est limité à un certain nb d'éléments? Combien pour mysql???
Marsh Posté le 19-11-2004 à 15:28:56
Si tu utilises le NOT IN avec une série de variables ( id NOT IN(1, 2, 3) ) pas de soucis, c'est prévu pour. Je pense que krolours1 faisait plutôt référence aux subselects dans les NOT IN: par ex WHERE id NOT IN (select id FROM table WHERE...)
Ceux là sont à éviter et à remplacer éventuellement par des NOT EXISTS (pas super propres non plus mais plus rapides et parfois on ne peut pas les éviter simplement).
Bien sûr cela ne vaut pas pour MySQL (du moins les anciennes versions) qui ne gèrent pas les sous-requêtes.
Sinon pour spir et effisk: dbms = gestionnaire de base de données. En clair MySQL, Oracle, PostgreSQL, Ingres, etc sont des dbms.
Marsh Posté le 19-11-2004 à 15:29:21
rufo a écrit : ah? le not in est limité à un certain nb d'éléments? Combien pour mysql??? |
Aucune idée. Oracle ça butte vers 1000 valeurs.
Marsh Posté le 19-11-2004 à 15:31:47
C'est clair que par exemple :
Code :
|
Est à remplacer par :
Code :
|
Marsh Posté le 19-11-2004 à 20:13:38
jointure externe et check à NULL ...
(si ça passe avec mySql ... )
Marsh Posté le 19-11-2004 à 21:17:31
Mh... Merci.
En fait j'avais commencé par faire une jointure imbriqué mais ca ne marchait pas alors j'ai opter pour une récupération des valeurs pour les mettre ds un "not in (valeur1, valeur2,...)" ce qui n'est pas top.
Bon bah je vais essayer de me débrouiller avec le NOT EXISTS que j'avais oublié.
mille merci.
Marsh Posté le 20-11-2004 à 17:56:21
Voilà exactement le code :
Code :
|
Marsh Posté le 21-11-2004 à 13:15:22
sous-requête detected Ca marche qu'avec la dernière version de MySql, je crois. C'est pas le not in qui coince...
Marsh Posté le 22-11-2004 à 11:47:50
Bingo. Les sous-requetes sont prises en charge qu'à partir de la 4.1 si ma mémoire ne me joue pas des tours.
C'est quand même super vieux comme version...
[edit]
...et tu fais mention de la "dernière version" dans ton premier post, tu es loin du compte!
Marsh Posté le 22-11-2004 à 11:58:09
ils sont pas chiés de faire tourner le site avec une vieille version comme ça! on développe avec une version plus récente, t'es obligé de vérifier la compatibilité à chaque ligne de code, relou!
Marsh Posté le 22-11-2004 à 13:22:40
bah, les 3.23.x ont une bonne réputation côté stabilité et tout...
Marsh Posté le 22-11-2004 à 18:19:40
rufo a écrit : bah, les 3.23.x ont une bonne réputation côté stabilité et tout... |
ahbon.
Le truc pénible, c'est que Spir développe un truc, ça marche pas en ligne, faut faire une modif, et la gonzesse qui gère le site n'y connaît absolument rien et comprend pas qu'il y ait des problèmes et du débuggage à faire...
'fin bref, problème réglé, merci les gars
Marsh Posté le 19-11-2004 à 11:36:36
Apparement la dernière version de MySQL n'accepte pas les NOT IN.
Par quoi le remplacer?