[MySQL] WHERE avec NOT IN

WHERE avec NOT IN [MySQL] - SQL/NoSQL - Programmation

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?

Reply

Marsh Posté le 19-11-2004 à 11:36:36   

Reply

Marsh Posté le 19-11-2004 à 11:44:33    

par un autre dbms?
 
[:neowen]

Reply

Marsh Posté le 19-11-2004 à 11:49:58    

dbms??

Reply

Marsh Posté le 19-11-2004 à 11:52:58    

+1
 
ça m'intéresse cette question.


---------------
London Box Office: Comédie Musicale Londres
Reply

Marsh 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.

Reply

Marsh Posté le 19-11-2004 à 12:46:20    

krolours1 a écrit :

Il me semble que ça fonctionne avec les versions >= 4.
 
En passant en général il vaut mieux éviter les NOT IN.


 
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 () :D

Reply

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 :lol:)
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.

Reply

Marsh Posté le 19-11-2004 à 15:15:21    

Ceci dit, comprends pas... "val2, val3, ..." c'est quoi ? des valeurs ou des colonnes ?

Reply

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...

Reply

Marsh Posté le 19-11-2004 à 15:24:42    

Arjuna a écrit :

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 :lol:)
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.


 
ah? le not in est limité à un certain nb d'éléments? Combien pour mysql??? :(

Reply

Marsh Posté le 19-11-2004 à 15:24:42   

Reply

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.


---------------
Reality is that which, when you stop believing in it, doesn't go away.
Reply

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.

Reply

Marsh Posté le 19-11-2004 à 15:31:47    

C'est clair que par exemple :
 

Code :
  1. SELECT *
  2. FROM T1
  3. WHERE T1.ID NOT IN (SELECT T2.ID FROM T2 WHERE T2.FK = T1.ID)


 
Est à remplacer par :
 

Code :
  1. SELECT *
  2. FROM T1
  3. WHERE NOT EXISTS (SELECT NULL FROM T2 WHERE T2.ID = T1.ID and T2.FK = T1.ID)

Reply

Marsh Posté le 19-11-2004 à 20:13:38    

jointure externe et check à NULL ...
 
(si ça passe avec mySql ... )

Reply

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.


Message édité par Spir le 19-11-2004 à 21:18:01
Reply

Marsh Posté le 20-11-2004 à 17:56:21    

Voilà exactement le code :

Code :
  1. $requete_COMPETITION = "SELECT COMPETITION.id_competition, ... "
  2.                       . "FROM COMPETITION, MOIS "
  3.                       . "WHERE COMPETITION.id_mois = MOIS.id_mois "
  4.                       . "AND COMPETITION.id_competition NOT IN (SELECT COMPETITION.id_competition FROM COMPETITION WHERE COMPETITION.id_mois < $num_mois_courant AND COMPETITION.annee < $num_annee_suivante ) ";

Reply

Marsh Posté le 20-11-2004 à 20:22:37    

Quelle version de MySQL ?

Reply

Marsh Posté le 21-11-2004 à 13:15:22    

sous-requête detected :D Ca marche qu'avec la dernière version de MySql, je crois. C'est pas le not in qui coince...

Reply

Marsh Posté le 22-11-2004 à 10:07:41    

C'est pour ça que j'ai demandé la version :D

Reply

Marsh Posté le 22-11-2004 à 11:39:38    

Le serveur tourne avec MySQL 3.23.56

Reply

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... [:mlc]
 
 
[edit]
 
...et tu fais mention de la "dernière version" dans ton premier post, tu es loin du compte! [:ula]


Message édité par skeye le 22-11-2004 à 11:48:45

---------------
Can't buy what I want because it's free -
Reply

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!


---------------
London Box Office: Comédie Musicale Londres
Reply

Marsh Posté le 22-11-2004 à 13:22:40    

bah, les 3.23.x ont une bonne réputation côté stabilité et tout...

Reply

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
 [:mad_oc@school]


---------------
London Box Office: Comédie Musicale Londres
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed