[MySQL 5.0.18] Syntaxe du "NOT IN" modifiée?

Statut
N'est pas ouverte pour d'autres réponses.

k o D

Elite
Bonjour, ma question semble assez simple pour un habitué ;)

Je développe des applications en PHP tout d'abord en local sur MySQL 4.1.10.
Pour une de mes requêtes SQL, j'utilise un "NOT IN" qui tourne parfaitement en local.

Seulement une fois que je met mes pages sur le net, sur le MySQL 5.0.18 j'obtiens une erreur de syntaxe... :roll:
Mais pourquoi diable auraient-ils changé celà? :pfiou:

Enfin voici ma requête:

Code:
SELECT idMembre,pseudo FROM membre WHERE acces=1 AND
idMembre NOT IN(
SELECT idMembre FROM membreTeam WHERE idLineUp='$_POST[idLineUp]'
)
Et voici l'erreur générée:

Code:
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 idMembre FROM membreTeam WHERE idLineUp='6' )' at

Voilà, merci d'avance pour votre réponse :cool:
 

II phl II

Touriste
es-tu sûr que cela provient du NOT IN

J'ai déjà eu qq soucis avec des requêtes imbriquées (un SELECT dans un SELECT)
En local : pas de prob
Sur le server de mon hébergeur : erreur
Ce que je fais dans ces cas-là, c'est faire une première requête et mettre son résultat dans une variable puis utiliser cette variable dans la requête principale

expl :
Code:
//première requête :
$select = 'SELECT count(id) FROM theme';
$result = mysql_query($select)  or die ('Erreur : '.mysql_error() );
$row = mysql_fetch_row($result);
$total = $row[0];

//requête principale
$sql = "SELECT id,nom,date,DATE_FORMAT(date,'%d/%m/%Y') AS datefr FROM theme ORDER by date DESC LIMIT 1,$total";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
Donc je mets le résultat de la première requête en variable ($total)
et j'utilise $total dans la principale

Essaye toujours :-'
 

Bingo

Beer Addict
C'est normal qu'il n'y ait pas d'espace entre ton "NOT IN" et ta parenthèse ?
Je sais que depuis mysql 5.0, la syntaxe est "stricte" par défaut.
Regarde dans la doc à SQL MODES , il y a notamment un chapitre sur IGNORE_SPACE.
 
1er
OP
k o D

k o D

Elite
Hum...

Code:
$req2="SELECT idMembre FROM membreTeam WHERE idLineUp='$_POST[idLineUp]'";
$res2=mysql_query($req)or die('Erreur SQL !'.$sauv.'<br>'.mysql_error());
							$row2 = mysql_fetch_object($res2);							
							$req="SELECT idMembre,pseudo FROM membre WHERE acces=1 AND
							idMembre NOT IN(
								'$row2'
							)";
En effectuant ceci plus d'erreur de syntaxe, mais il ne tient pas compte du NOT IN.
 
1er
OP
k o D

k o D

Elite
Bingo a dit:
C'est normal qu'il n'y ait pas d'espace entre ton "NOT IN" et ta parenthèse ?
Je sais que depuis mysql 5.0, la syntaxe est "stricte" par défaut.
Regarde dans la doc à SQL MODES , il y a notamment un chapitre sur IGNORE_SPACE.
Même en mettant un espace après le NOT IN celà ne fonctionne pas.

C'est bien ceci que tu voulais que je fasse:

NOT IN (
au lieu de
NOT IN(
 

Bingo

Beer Addict
k o D a dit:
Même en mettant un espace après le NOT IN celà ne fonctionne pas.

C'est bien ceci que tu voulais que je fasse:

NOT IN (
au lieu de
NOT IN(
Oui c'était bien ça. C'est bizarre ton histoire.
Et si tu remplaces "NOT IN" par "<> ALL" ?
 
1er
OP
k o D

k o D

Elite
Pourtant j'utilise bien la syntaxe présente dans le manuel:

Code:
SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);
 

Bingo

Beer Addict
Oui, avec l'espace la syntaxe est bonne.
Sans l'espace c'est faux, mais c'est possible qu'il y ait eu une tolérance dans les versions précédentes.
 
1er
OP
k o D

k o D

Elite
Bingo a dit:
Oui c'était bien ça. C'est bizarre ton histoire.
Et si tu remplaces "NOT IN" par "<> ALL" ?
Voici l'erreur retournée:

Code:
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 'ALL (SELECT idMembre FROM membreTeam WHERE idLineUp='6')' at li
Et pourtant en local encore une fois, çà tourne bien!

Voici exactement mon code:

Code:
$req="SELECT idMembre,pseudo FROM membre WHERE acces=1
AND idMembre NOT IN (SELECT idMembre FROM membreTeam WHERE idLineUp='$_POST[idLineUp]')";
$res=mysql_query($req)or die('Erreur SQL !'.$sauv.'<br>'.mysql_error());
while ($row = mysql_fetch_object($res)) {}
 

Bingo

Beer Addict
Bizarre ça... Tu es sûr de ta version de MySQL en ligne ?
 
1er
OP
k o D

k o D

Elite
Bingo a dit:
Ouais, version 4.0 : pas de sous requêtes !
Mm désolé j'avais mal lu...
Et en local, je tourne avec la version 4.1...

Didju je vais regarder pour updater MySQL chez OVH.

(Vive Sybase :-D )
 

Bingo

Beer Addict
Ouais, les versions pré-4.1 sont vraiment trop limitées.
Demande si ils n'ont pas du PostgreSQL, y a que ça devrai ! ;)
 

II phl II

Touriste
tiens ... ça correspond à quoi le client MySQL: 5.0.18
je pensais que c'était la version MySQL moi :-'
 
1er
OP
k o D

k o D

Elite
II phl II a dit:
tiens ... ça correspond à quoi le client MySQL: 5.0.18
je pensais que c'était la version MySQL moi :-'
idem
 

Bingo

Beer Addict
C'est la version du client. Si tu te connectes en ligne de commande, tu utilises un client :
C:\>mysql.exe -Uroot -ppass -h monserveur.ovh.com -d maDB
Ici, mysql.exe est le client.

Si tu as installé mysql 5.0.18 en local, tu utilises le client qui est installé avec mysql 5.0.18.

MySQL c'est un DB client/serveur (pas comme Access par exemple). Tu te connectes à un serveur avec un client. En ligne de commande, le client c'est l'exécutable que tu utilises, si tu es en PHP c'est la version de l'API Client utilisée pour compiler ton PHP (je pense que c'est 4.1.xx avec les packages PHP classiques).
 

II phl II

Touriste
ok merci

et comment puis-je savoir la version MySQL présente sur un server alors ?
qd je fais un phpinfo(); je n'ai que la version du client :-s
 
G

grosnours

ex membre
SELECT version();

Edit:
En principe, si le serveur mysql tourne sur la même machine que le serveur web, la version du client fournie par phpinfo est la même que celle du serveur mysql.
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut