aide pour un NOT IN sur un resultat d'une requete

aide pour un NOT IN sur un resultat d'une requete - SQL/NoSQL - Programmation

Marsh Posté le 15-03-2005 à 12:29:32    

hello,
 
je sais pas si c'est possible ce que je demande mais je tente.
 
j'aimerai faire un select avec un NOT IN qui prendrai en parametre le resultat d'une requete:
 
SELECT * FROM `membres`
WHERE id
NOT IN (
SELECT id_membres
FROM table
WHERE condition
)
 
c'est possible ?
 
je precise que j'ai un message d'erreur de mysql mais peux etre qu'il faut modifier legerement pour que ca passe.
c'est pour ca que je fait appel a vous :jap:


Message édité par veryfree le 15-03-2005 à 12:30:57
Reply

Marsh Posté le 15-03-2005 à 12:29:32   

Reply

Marsh Posté le 15-03-2005 à 15:28:15    

up

Reply

Marsh Posté le 15-03-2005 à 15:43:55    

ça devrait très bien fonctionner...quelle est l'erreur?


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

Marsh Posté le 15-03-2005 à 15:47:23    

avant de te repondre, voici ce que j'ai trouvé et qui m a aider:
 

Citation :

Select all records from a table which do not share a common ID with records from a second table:
 
select * from table1
where field1 not in (select field2 from table2)
 
Note: Sub-queries are quite slow and are not supported in MySQL, so the above will not work in MySQL.
 
or an alternative using a join (which can be much faster):
 
    select table1.* from table1
    left join table2 on (table1.field1 = table2.field2)
    where table2.field2 is null;
 
The following method (which has been suggested by Michael Miller) is to use EXISTS. It is much faster on SQL Server than the above (but Michael says it is comparable with the left join technique on Oracle):
 
    select * from table1
    where not exists (select field2 from table2 where table2.field2 = table1.field1)


 
apparemment donc, mysql ne gere pas ce genre de requete meme si c'est du SQL correct.
mieux vaux faire une jointure.
j'ai un resultat mais je serai incapable de verifier s'il est coherent  [:veryfree]


Message édité par veryfree le 15-03-2005 à 15:47:54
Reply

Marsh Posté le 15-03-2005 à 15:51:55    

Les sous-requetes sont supportées par mysql depuis la 4.11 ou un numéro du genre...:o


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

Marsh Posté le 15-03-2005 à 15:57:59    

tu voulais le message d'erreur, le voici:
 
#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT id_membres
FROM  grilles
) LIMIT 0, 30' at line 4  
 
 
 

Citation :

SELECT *
FROM `membres`
WHERE id NOT
IN (
 
SELECT id_membres
FROM grilles
)
LIMIT 0 , 30


 
pas tres explicite tout ca  [:mmmfff]

Reply

Marsh Posté le 15-03-2005 à 16:01:45    

Quelle version de mysql?


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

Marsh Posté le 15-03-2005 à 16:11:12    

MySQL 4.0.23_Debian-7-log  
 
on tiens peux etre quelque chose la :whistle:

Reply

Marsh Posté le 15-03-2005 à 16:12:18    

Citation :


 Depuis MySQL version 4.1, une clause IN() peut aussi contenir une sous-requête


http://dev.mysql.com/doc/mysql/fr/ [...] ators.html


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

Marsh Posté le 15-03-2005 à 16:27:28    

merci,
voila qui me rassure, on va faire autrement et surement demander une mise a jour de mysql :jap:

Reply

Marsh Posté le 15-03-2005 à 16:27:28   

Reply

Marsh Posté le 16-03-2005 à 17:26:55    

Essaye ça:
 
SELECT membres.* FROM membres
LEFT JOIN table ON table.id_membres = membres.id
WHERE table.id_membres IS NULL;
 
Le principe est de faire une jointure externe avec la table ou la ligne peut ne pas exister. Si la ligne n'existe pas, l'id_membres est mis à NULL par la jointure externe ...

Reply

Marsh Posté le 16-03-2005 à 18:10:17    

c'est exactement ce que j'ai fait ;)
en plus c'est plus rapide :
 

Citation :


or an alternative using a join (which can be much faster):  
 
    select table1.* from table1  
    left join table2 on (table1.field1 = table2.field2)  
    where table2.field2 is null;


 
:hello:

Reply

Sujets relatifs:

Leave a Replay

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