[MySQL] Sous-requête

Sous-requête [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 10-06-2005 à 13:05:23    

Hello
 
Je cherche à faire une requête imbriquée du type

Code :
  1. SELECT *
  2. FROM `inscrire`
  3. WHERE `saisons_id` = (
  4. SELECT MAX( `saisons_id` )
  5. FROM `inscrire` )


 
et ça marche pô
 
La je sais, elle sert à rien mis c'est pour l'exemple.
 
Serveur Mysql 5
 
Je suppose que c'est un problème de syntaxe mais je sèche...
 
Merci de votre aide


---------------
Just Free It
Reply

Marsh Posté le 10-06-2005 à 13:05:23   

Reply

Marsh Posté le 10-06-2005 à 13:17:36    

quel est le message d'erreur?

Reply

Marsh Posté le 10-06-2005 à 13:33:28    

Je reprends un exemple:
 
requete qui marche:

Code :
  1. SELECT villes.villes_nom, COUNT( * )
  2. FROM adherents, villes
  3. WHERE (
  4. (
  5. adherents.villes_id = villes.villes_id
  6. ) AND (
  7. villes.villes_cp
  8. IN ( 94290, 94480 )
  9. )
  10. )
  11. GROUP BY villes.villes_nom


 
ca me donne les comptes
 
maintenant, je veux étendre le nombre de code postaux:
 

Code :
  1. SELECT villes.villes_nom, COUNT( * )
  2. FROM adherents, villes
  3. WHERE (
  4. (
  5. adherents.villes_id = villes.villes_id
  6. ) AND (
  7. villes.villes_cp
  8. IN (SELECT villes.villes_cp
  9. FROM villes)
  10. )
  11. )
  12. GROUP BY villes.villes_nom


 
Erreur:
 

Citation :

#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 villes.villes_cp
FROM villes ) ) )
GROUP  BY villes.vill  


 
Merci de ton aide simogeo


Message édité par Fane_CHP le 10-06-2005 à 13:38:13

---------------
Just Free It
Reply

Marsh Posté le 10-06-2005 à 13:42:08    

Fane_CHP a écrit :

Je reprends un exemple:
 
requete qui marche:

Code :
  1. SELECT villes.villes_nom, COUNT( * )
  2. FROM adherents, villes
  3. WHERE (
  4. (
  5. adherents.villes_id = villes.villes_id
  6. ) AND (
  7. villes.villes_cp
  8. IN ( 94290, 94480 )
  9. )
  10. )
  11. GROUP BY villes.villes_nom


 
ca me donne les comptes
 
maintenant, je veux étendre le nombre de code postaux:
 

Code :
  1. SELECT villes.villes_nom, COUNT( * )
  2. FROM adherents, villes
  3. WHERE (
  4. (
  5. adherents.villes_id = villes.villes_id
  6. ) AND (
  7. villes.villes_cp
  8. IN (
  9. SELECT villes.villes_cp
  10. FROM villes
  11. )
  12. )
  13. )
  14. GROUP BY villes.villes_nom


 
Erreur:
 

Citation :

#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 villes.villes_cp
FROM villes ) ) )
GROUP  BY villes.vill  


 
Merci de ton aide simogeo


Salut,
 
Essaie plutôt de faire des jointures... Cela rends ta requête plus claire (enfin pour ma part)... Ensuite, ta sous-requête n'est pas très intéressantes puisqu'elle pourrait te ramener plusieurs CP. Donc il faut faire un group by dessus. Ce qui fait que ta requête, si je ne me suis pas trompé, devrait être:

Code :
  1. SELECT v.villes_nom, COUNT( * ) FROM adherents a INNER JOIN villes v on a.villes_id = v.villes_id WHERE v.villes_cp IN (SELECT villes_cp FROM Villes GROUP BY Villes_cp) GROUP BY v.villes_nom


Voilà... J'espère que cela pourra t'aider.
 
A+

Reply

Marsh Posté le 10-06-2005 à 13:52:10    

J'ai toujours la même erreur
 
Ca s'était un exemple simplifié. La requete finale que je cherche à faire est sur 5 ou 6 tables, je vous ai épargné le truc ... ;)  
 
Le inner join, c'est normal qu'il y ait des a et de v qui se balladent.?


---------------
Just Free It
Reply

Marsh Posté le 10-06-2005 à 14:19:44    

ce sont des alias de tables pour qu'elles aient un nom plus courts et donc qui rendent la requête un petit moins bordélique :)


Message édité par onizuka_sensei le 10-06-2005 à 14:20:08
Reply

Marsh Posté le 10-06-2005 à 14:24:51    

T'es sûr que c'est une version 5 ?
Parceque le comportement et le message d'erreur, ça ressemble à une version < 4.1
 
Peut-être un problème de paramètrage.
 
En tout cas, la première requête est bonne.
 
PS: Vilre les `, c'est dégueulasse, pas standard, ça sert à rien et j'aime pas ça.
PS²: Les a et v qui se baladent, ce sont des alias, pour éviter de recopier tout le nom de la table à chaque fois qu'on appelle un champ de la table.

Reply

Marsh Posté le 10-06-2005 à 14:26:03    

OK pour les alias, ça peut servir.
 
Mais la sous-requête ne marche toujours pas, j'ai la même erreur (avec un inner join, ça ne me donne plus rien par contre)


---------------
Just Free It
Reply

Marsh Posté le 10-06-2005 à 14:29:24    

Moi je te dis, problème de paramètrage, ou alors tu confonds la version de MySQL avec celle d'un autre outils

Reply

Marsh Posté le 10-06-2005 à 15:59:40    

Non j'ai fumé, c'est une 4.0.17 (OVH)
 
Est-ce qu'il y a une solution avec un JOIN?
 
j'explique ce que je veux faire:
 
table1: adherents {adherents_id, adherents_nom...... }
table2: saisons { saisons_id, saisons_libelle ......}
table3: inscrire {adherents_id, saisons_id)
+ d'autres qui ne posent pas de problèmes.
 
Je veux les adhérents inscrits pour la saison en cours
 
J'avais donc pensé à un  

Code :
  1. SELECT adherents.*
  2. FROM adherents, inscrire, saisons
  3. WHERE ((adherents.adherents_id=inscrire.adherents_id)
  4. AND (inscrire.saisons_id=saisons.saisons_id)
  5. AND (saisons_saisons_libelle=(SELECT MAX(saisons_libelle) FROM saisons)))


 
Vu que le serveur n'a pas l'air d'apprecier, comment faire. Merci ... :jap:


---------------
Just Free It
Reply

Marsh Posté le 10-06-2005 à 15:59:40   

Reply

Marsh Posté le 10-06-2005 à 17:30:00    

et bah voila, j'ai essayé sur une 4.1.11 et ma sous requete marche. Plus qu'a attendre que mon hébergeur valide une 4.1.x.
 
A moins que someone ait une solution équivalente qui marche sur une 4.0.x


---------------
Just Free It
Reply

Marsh Posté le 13-06-2005 à 12:49:45    

:cry:

Reply

Sujets relatifs:

Leave a Replay

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