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

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

grosnours

ex membre
Te reste donc plus qu'à faire deux requêtes ... mysql sux ;)
 

Bingo

Beer Addict
grosnours a dit:
Te reste donc plus qu'à faire deux requêtes ... mysql sux ;)
Dans ce cas précis il y a moyen de se passer de sous requête :

SELECT m.idMembre, m.pseudo
FROM membre AS m LEFT JOIN membreTeam AS mt
ON (m.idMembre = mt.idMembre AND mt.idLineUp = idLineUp='$_POST[idLineUp]')
WHERE acces=1 AND mt.idMembre IS NULL;
 
G

grosnours

ex membre
Y a des jointures en mysql 4.0 ? Jpensais que ça se limite à select,insert,delete :p
 

Bingo

Beer Addict
grosnours a dit:
Y a des jointures en mysql 4.0 ? Jpensais que ça se limite à select,insert,delete :p
Mouais, quand même...
A mon avis même en MySQL 1 il y avait des jointures.
Sinon tu peux pas vraiment appeler ça SQL... ;)
 

LaRaclure

Touriste
Bingo a dit:
Ouais, les versions pré-4.1 sont vraiment trop limitées.
Demande si ils n'ont pas du PostgreSQL, y a que ça devrai ! ;)
+1 enfin ca c'est de la vraie database SQL
 

Bingo

Beer Addict
LaRaclure a dit:
+1 enfin ca c'est de la vraie database SQL
Ouais, mais va trouver un hébergeur bon marché en PostgreSQL...
J'ai trouvé Lost Oasis (30¤ HT par an), tout le reste c'est au dessus de 50¤ par an.
En gros, c'est plus pour ceux qui peuvent se payer un serveur que pour ceux qui sont en hébergement mutualisé.
 
1er
OP
k o D

k o D

Elite
Bingo a dit:
Ouais, mais va trouver un hébergeur bon marché en PostgreSQL...
J'ai trouvé Lost Oasis (30¤ HT par an), tout le reste c'est au dessus de 50¤ par an.
En gros, c'est plus pour ceux qui peuvent se payer un serveur que pour ceux qui sont en hébergement mutualisé.
Ben je suis chez OVH en 90 plan qui coûte 65¤ par an et je ne pense pas qu'il y ai PostgreSQL.

Enfin bon sinon pour la petite histoire, je m'en suis sorti en transformant ma requête de cette manière:

Code:
SELECT M.idMembre,M.pseudo, MT.idMembreTeam 
FROM membreTeam MT NATURAL RIGHT OUTER JOIN membre M
WHERE M.acces=1
AND (MT.idMembreTeam IS NULL OR MT.idLineUp <> '$_POST[idLineUp]')
 

Bingo

Beer Addict
Effectivement, chez OVH il n'y a pas PostgreSQL.

Pour ta requête, tu ne devrais pas utiliser de RIGHT JOIN (c'est réputé peu portable), utilise plutôt des LEFT JOIN.
Et ici, je ne comprends pas pourquoi tu utilises NATURAL ? Ca ne devrait même pas être autorisé, un "NATURAL JOIN" ça joint deux tables sur TOUTES leurs colonnes !
A mon avis c'est une tolérance de MySQL de te laisser faire ça, mais c'est incorrect.

Essaye avec la requête que j'ai postée, c'est la méthode "consacrée" pour faire ça sans sous-requête.
 
1er
OP
k o D

k o D

Elite
Bingo a dit:
Effectivement, chez OVH il n'y a pas PostgreSQL.

Pour ta requête, tu ne devrais pas utiliser de RIGHT JOIN (c'est réputé peu portable), utilise plutôt des LEFT JOIN.
Et ici, je ne comprends pas pourquoi tu utilises NATURAL ? Ca ne devrait même pas être autorisé, un "NATURAL JOIN" ça joint deux tables sur TOUTES leurs colonnes !
A mon avis c'est une tolérance de MySQL de te laisser faire ça, mais c'est incorrect.

Essaye avec la requête que j'ai postée, c'est la méthode "consacrée" pour faire ça sans sous-requête.
Oui je teste la tienne, je me suis rendu compte que ma solution est incorrecte.

Maintenant pour le "NATURAL" je t'avoue que je n'ai fait que recopier de mon cours SQL où nous travaillons en Sybase, çà doit venir de là.
 

Bingo

Beer Addict
Ah ouais, OK.
Un NATURAL JOIN, entre-nous, je n'en ai jamais utilisé.
C'est vraiment très spécial comme jointure.
 
1er
OP
k o D

k o D

Elite
Mais même ta solution ne me donne pas quelque chose de juste.
Il me remet quand même une personne qui fait déjà partie du lineup.

Donc voici ce qu'il doit me retourner:

l'ensemble des membres qui ont une déjà un line-up (présent de membreTeam donc) mais qui n'appartiennent pas au line-up sélectionné et les membres qui ont un accès à 1 et qui eux ne sont pas encore présent dans un line-up.
 
1er
OP
k o D

k o D

Elite
En fait je n'arrive vraiment pas à l'exprimer d'une autre manière que ce que j'avais avant:

Code:
SELECT idMembre,pseudo FROM membre WHERE acces=1 
AND idMembre NOT IN (
SELECT idMembre FROM membreTeam WHERE idLineUp='$_POST[idLineUp]'
)
 
G

grosnours

ex membre
Exécute le " SELECT idMembre FROM membreTeam WHERE idLineUp='$_POST[idLineUp]' ", tape tous les résultats (séparés par des ,) dans un string et exécute l'autre requête en remplaçant la requête précédent par son résultat.

Il me semble me souvenir qu'on ne peut pas remplacer un NOT IN par une jointure.
 

Bingo

Beer Addict
Ta requête te donne les membres qui ont acces = 1 et qui n'appartiennent pas au lineup selectionné. Elle ne fais pas vraiment ce que tu dis.

Pour ça tu dois faire :

SELECT m.idMembre, m.pseudo
FROM membre AS m LEFT JOIN membreTeam AS mt
ON (m.idMembre = mt.idMembre)
WHERE m.acces = 1 AND mt.idMembre IS NULL
UNION
SELECT m.idMembre, m.pseudo
FROM membre AS m LEFT JOIN membreTeam AS mt1
ON (m.idMembre = mt1.idMembre AND mt1.idLineUp='$_POST[idLineUp])
LEFT JOIN membreTeam AS mt2
ON (m.idMembre = mt2.idMembre)
WHERE mt1.idMembre IS NULL AND mt2.idMembre IS NOT NULL;

Ou un truc dans le genre quoi...
 

Bingo

Beer Addict
grosnours a dit:
Il me semble me souvenir qu'on ne peut pas remplacer un NOT IN par une jointure.
Ca dépend. Celui là on peut.
Mais sa requête avec son 'NOT IN' ne fait déjà pas ce qu'il veut.
 
1er
OP
k o D

k o D

Elite
Bingo a dit:
Ca dépend. Celui là on peut.
Mais sa requête avec son 'NOT IN' ne fait déjà pas ce qu'il veut.
Pourtant j'obtiens bien ce que je veux...
Je m'exprime peut-être mal alors.

Bon j'ai donc une table membre qui contient les infos principales sur les membres dont un champ "acces" qui m'indique s'il s'agit d'un membre dont il est possible qu'il ait une ou plusieurs référence(s) de sa PK (idMembre) dans un ou plusieurs tuple(s) de ma table membreTeam.

Tous les membres ne sont donc pas référencés par membreTeam y compris ceux dont l'accès est à '1'.
 
1er
OP
k o D

k o D

Elite
Bingo a dit:
Ta requête te donne les membres qui ont acces = 1 et qui n'appartiennent pas au lineup selectionné. Elle ne fais pas vraiment ce que tu dis.

Pour ça tu dois faire :

SELECT m.idMembre, m.pseudo
FROM membre AS m LEFT JOIN membreTeam AS mt
ON (m.idMembre = mt.idMembre)
WHERE m.acces = 1 AND mt.idMembre IS NULL
UNION
SELECT m.idMembre, m.pseudo
FROM membre AS m LEFT JOIN membreTeam AS mt1
ON (m.idMembre = mt1.idMembre AND mt1.idLineUp='$_POST[idLineUp])
LEFT JOIN membreTeam AS mt2
ON (m.idMembre = mt2.idMembre)
WHERE mt1.idMembre IS NULL AND mt2.idMembre IS NOT NULL;

Ou un truc dans le genre quoi...
Bon celà semble fonctionner.
Je vais faire des tests pour çà mais à 1ère vue, çà tourne.
 

Bingo

Beer Addict
k o D a dit:
Bon celà semble fonctionner.
Je vais faire des tests pour çà mais à 1ère vue, çà tourne.
OK, vérifie bien quand même parce que je suis pas sûr d'avoir compris ce que tu voulais comme résutat (ne sachant pas ce que signifient exactement les champs, c'est pas évident).
 
1er
OP
k o D

k o D

Elite
Bingo a dit:
OK, vérifie bien quand même parce que je suis pas sûr d'avoir compris ce que tu voulais comme résutat (ne sachant pas ce que signifient exactement les champs, c'est pas évident).
J'ai fait pas mal de test et çà passe comme il faut.
Mais bon j'en ferai encore évidemment :)
 

Bingo

Beer Addict
OK, tant mieux. Les "UNION" c'est pas hyper recommandé, alors quand on peut s'en passer c'est mieux.
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut