[MySQL] pb avec une requête et EXISTS

pb avec une requête et EXISTS [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 08-10-2007 à 14:03:08    

Bonjour à tous,

 

Je rencontre actuellement un problème avec une requête qui fonctionne bien sous MySQL 5 en local mais pas en MySQL 3.23 sur mon serveur.

 

J'ai les 2 tables suivantes :

 

CONTACT
---------
+ id_user
+ contact

 

CONNECTES
-----------
+ id_user
+ pseudo

 

Je voudrais récupérer les contacts connectés et j'utilise la requête suivante :

Code :
  1. select c1.id_user,c1.pseudo from connectes c1 where exists (select * from contact c2 where c2.id_user=1 and c2.contact=c1.id_user) order by pseudo asc
 

Celle-ci fonctionne bien en local mais pas sur le serveur : pourriez-vous m'aider ?

 

Merci d'avance :jap:


Message édité par nero27 le 08-10-2007 à 14:03:29
Reply

Marsh Posté le 08-10-2007 à 14:03:08   

Reply

Marsh Posté le 08-10-2007 à 14:09:35    

pas de subquery sur mysql avec la version 4.1

 

edit: mais tu peux t'en sortir en re-ecrivant ta requete avec un left outer + where is null


Message édité par anapajari le 08-10-2007 à 14:10:00
Reply

Marsh Posté le 08-10-2007 à 14:13:15    

Arf, ceci explique cela :/
 
Par contre, je ne suis pas très doué en SQL et le left outer, je ne maitrise pas : tu pourrais m'aider ?

Reply

Marsh Posté le 08-10-2007 à 14:25:40    

C'est bon, je m'en suis sorti avec la doc :
 

Code :
  1. SELECT connectes. * FROM connectes
  2. LEFT JOIN contact ON connectes.id_user = contact.contact
  3. WHERE contact.id_user=1 
  4. ORDER BY pseudo ASC


 
Merci pour ton aide :jap:

Reply

Marsh Posté le 08-10-2007 à 14:30:52    

Bon alors:
1- j'avais dit des conneries :) vu que tu avais un exists ( et pas un not exists) il fallait bien entendu te servir de inner join et non de left outer + where is null

 

2- c'est pas très beau la façon dont tu as écris la requete.
En fait, tu fais un left outer que tu transformes en mettant une condition sur ta table "left jointée" dans le where.
Je te conseillerais fortement de faire

Code :
  1. SELECT connectes. * FROM connectes
  2.     INNER contact ON connectes.id_user = contact.contact
  3.     WHERE contact.id_user=1 
  4.     ORDER BY pseudo ASC


Par ailleurs, MagicBuzz a fait un topic sur les bases du SQL, il y a un très bon post sur les jointures, je te conseille d'y jeter un oeil.

 

3- Sauf pour des tests, ne jamais faire de "select * ", toujours décrire la liste des champs attendus ( le jour ou tu auras une modification de structure de ta table  tu comprendras pourquoi :) )

Message cité 1 fois
Message édité par anapajari le 08-10-2007 à 14:31:43
Reply

Marsh Posté le 08-10-2007 à 15:39:28    

anapajari a écrit :

Bon alors:
1- j'avais dit des conneries :) vu que tu avais un exists ( et pas un not exists) il fallait bien entendu te servir de inner join et non de left outer + where is null
 
2- c'est pas très beau la façon dont tu as écris la requete.
En fait, tu fais un left outer que tu transformes en mettant une condition sur ta table "left jointée" dans le where.
Je te conseillerais fortement de faire

Code :
  1. SELECT connectes. * FROM connectes
  2.     INNER contact ON connectes.id_user = contact.contact
  3.     WHERE contact.id_user=1 
  4.     ORDER BY pseudo ASC


Par ailleurs, MagicBuzz a fait un topic sur les bases du SQL, il y a un très bon post sur les jointures, je te conseille d'y jeter un oeil.
 
3- Sauf pour des tests, ne jamais faire de "select * ", toujours décrire la liste des champs attendus ( le jour ou tu auras une modification de structure de ta table  tu comprendras pourquoi :) )


1 et 2- Merci pour ton aide :jap:
Je regarderai le post de MagicBuzz, ça devrait m'aider :)
 
3- C'était pour le post que j'avais mis *, je détaille sinon ;)

Reply

Marsh Posté le 08-10-2007 à 15:44:48    

Ce ne serait pas inner join plutot que inner ?

Reply

Marsh Posté le 09-10-2007 à 09:22:53    

oui oui manque le join après le inner :o

Reply

Marsh Posté le 09-10-2007 à 11:11:38    

Dis-le que tu voulais voir si je suivais [:cupra]

Reply

Marsh Posté le 09-10-2007 à 17:42:20    

:lol:

Reply

Sujets relatifs:

Leave a Replay

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