Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/03/2011, 13h53   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 73
Points : 11
Points : 11
Par défaut erreur requete imbriquée

Bonjours à tous,

voila j ai un problème de requête imbriquée.
voici la requête en question :
Code :
1
2
 
SELECT * FROM insertion_job WHERE typeTexte=\'MP\' AND flag=1 AND idPage = (SELECT DISTINCT idPage FROM insertion_job WHERE typeTexte = \'SM\') ORDER BY sequence AND idPage
quand j'enlève la requête imbriquée ok cela fonctionne mais avec la requête imbriquée voici l'erreur qui m'est retournée

Citation:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row' in C:\wamp\www\site_test\menu.class.php:163 Stack trace: #0 C:\wamp\www\site_test\menu.class.php(163): PDO->query('SELECT * FROM i...') #1 C:\wamp\www\site_test\ViewMenu.class.php(24): Menu->testCreerMenu() #2 C:\wamp\www\site_test\site.class.php(36): ViewMenu->afficherMenu() #3 C:\wamp\www\site_test\index.php(196): Site->afficherSite() #4 {main} thrown in C:\wamp\www\site_test\menu.class.php on line 163
le but de la requête étant de récupérer tout les enregistrement qui ont un champ "SM" et ceux qui partage le même idPage
kazuzu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 14h10   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Citation:
Subquery returns more than 1 row
Votre sous requete retourne plus d'une ligne, vous ne pouvez donc pas utiliser l'opérateur de comparaison =, qui attend une valeur unique.

Si vous voulez filtrer par rapport a une liste, vous pouvez utiliser l'opérateur IN


Edit : suppression d'une partie de mon message
edit2 : merci d'indenter votre code, afin de le rendre plus lisible
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 14h25   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 73
Points : 11
Points : 11
Donc j ai remplacer = par IN mais la requête ne retourne plus rien

Finalement j ai fait comme ceci :
Code :
1
2
3
4
 
'SELECT * FROM insertion_job WHERE flag=1 AND idPage IN 
       (SELECT idPage FROM insertion_job WHERE typeTexte = \'SM\' ORDER BY sequence AND idPage)
        ORDER BY sequence AND idPage'
mais cela ne me trie pas comme je le souhaite pour que vous vous rendiez compte de ce que je veux c est que lorsque j affiche le dernier élément affiché devrait se trouver en 4éme position selon le ORDER BY que j ai demandé.
kazuzu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 14h53   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Code sql :
1
2
3
4
5
6
7
8
9
10
 
SELECT * 
FROM insertion_job 
WHERE typeTexte='MP' 
AND flag=1 
AND idPage IN (
	SELECT DISTINCT idPage 
	FROM insertion_job 
	WHERE typeTexte = 'SM') 
ORDER BY sequence
Si cette requete ne retourne rien, c'est que vous n'avez aucune ligne dans insertion_job, pour laquelle :
1/la colonne flag vaut 1
2/la colonne typeText vaut 'MP'
3/une autre ligne de insertion_job dont la colonne typeText vaut 'SM' a la meme idPage
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 14h55   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 73
Points : 11
Points : 11
j'ai édité mon post précédent j ai légèrement changé la requête et cela fonctionne mais ne trie pas de la manière souhaitée. en fait que si j'enlève le ORDER BY cela ne change rien
kazuzu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 15h01   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Si vous voulez trier sur plusieurs colonnes, la syntaxe est :

Code sql :
1
2
ORDER BY Colonne1 [ASC|DESC],Colonne2 [ASC|DESC]...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 15h08   #7
Candidat au titre de Membre du Club
 
Inscription : mars 2009
Messages : 73
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 73
Points : 11
Points : 11
a bon, et je ne savait pas qu'il fallait préciser si c'était ascendant ou descandant le tri à effectuer.
Mon prof nous avait simplement dit que order by suffisait
En tout cas apres avoir rebricoler un peu la requête j ai ce qu il me faut comme il me le faut. Je te remercie de ton aide
kazuzu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 15h15   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par kazuzu Voir le message
a bon, et je ne savait pas qu'il fallait préciser si c'était ascendant ou descandant le tri à effectuer.
Ce n'est pas obligatoire, si c'est omis, le tri a lieu par ordre croissant
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h42.


 
 
 
 
Partenaires

Hébergement Web