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 20/05/2011, 21h29   #1
Invité régulier
 
Inscription : mai 2007
Messages : 39
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 39
Points : 8
Points : 8
Par défaut Problème de requêtes imbriquées

Bonsoir à tous

Je me permets de solliciter votre aide afin de m'aider à résoudre un petit problème avec une requête SQL (d'où la rubrique du forum )

Je vous explique un petit le problème. J'ai une requête qui contient une deuxième requête à l’intérieur. Lors de son éxécution /s phpMyAdmin, j'obtiens l'erreur suivante :
#1242 - Subquery returns more than 1 row
Ma première requête me permet d'obtenir des informations sur une petite annonce (titre, description, prix ...etc), la seconde me permet de récupérer la liste des différents moyens d'expédition qui sont disponibles pour cette annonce (nom et prix du moyen d'éxpédition).

J'ai effectué des recherches mais je n'ai rien trouvé au sujet d'un cas similaire au mien ...

Si vous avez une idée ou une piste pour résoudre mon petit problème je prends avec plaisir

Merci d'avance et bonne soirée
mrocks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 22h37   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Bonjour,

Peut-on voir la requête en question, ainsi que le schéma des tables associées et éventuellement un petit jeu de données ?
Ça nous permettrait de répondre plus efficacement à la question.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2011, 01h28   #3
Invité régulier
 
Inscription : mai 2007
Messages : 39
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 39
Points : 8
Points : 8
Oui biensur

La table qui contient les annonces se présente ainsi :
#ads
id, title, description, price

#expedition
id, title

#ads_expedition
id, fk_ads, fk_expedition, price
Je vous donne un exemple d'une annonce "type" :

Un vélo (ads.id:1) est en vente au prix de 100€. Le vendeur permet pour la livraison de celui ci plusieurs possibilités à savoir : la remise en mains propres (expedition.id:1), l'expédition par la poste (expedition_id:2) au prix de 12€.

Les données de la table "ads_expedition" seraient les suivantes :

1;1;1;0
1;1;2;12

J'espère avoir pu être un petit peu plus clair

Merci d'avance pour votre temps
mrocks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2011, 02h17   #4
Membre confirmé
 
Homme
Développeur informatique
Inscription : avril 2011
Messages : 196
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Italie

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : avril 2011
Messages : 196
Points : 298
Points : 298
Bonsoir,

Peut-on voir la requête en question ou c'est un secret?
fab256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h23   #5
Invité régulier
 
Inscription : mai 2007
Messages : 39
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 39
Points : 8
Points : 8
Bonjour

Oui biensur j'avais totalement zappé de la mettre la dernière fois ...

Code :
1
2
3
4
5
6
7
8
9
$query = "SELECT A.`title`, A.`description`, A.`price`,
 
(    SELECT  E.`name`, AE.`price` 
     FROM    `ads_expedition` AE, `expedition` E 
     WHERE   E.`id` = '".$id."' 
     AND       AE.`fk_expedition` = '".$id."') AS expedition
 
FROM         `ads` A 
WHERE    A.`id` = '".$id."'";
J'espere que vous pourrez m'aider
Merci d'avance
mrocks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h39   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 003
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 003
Points : 18 265
Points : 18 265
Envoyer un message via MSN à CinePhil
Apparemment, tu as besoin d'un cours sur les jointures !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h03   #7
Invité régulier
 
Inscription : mai 2007
Messages : 39
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 39
Points : 8
Points : 8
Je pourrais avoir un petit axe sur lequel m'orienter ?
mrocks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h33   #8
Invité régulier
 
Inscription : mai 2007
Messages : 39
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 39
Points : 8
Points : 8
Bon j'ai essayé une requête qui me permet d'obtenir ce que je souhaite :

Code :
1
2
3
4
5
SELECT A.`title`, A.`description`, A.`price`, E.`name`, AE.`price` AS price2  
FROM `ads` A 
JOIN `ads_expedition` AE ON A.`id` = AE.`fk_ads` 
JOIN `expedition` E ON AE.`fk_expedition` = E.`id` 
WHERE A.`id` = '1'
J'obtiens :

TITRE1 | DESCRIPTION1 | PRICE1 | NAME_EXPEDITION1 | PRICE_EXPEDITION1
TITRE1 | DESCRIPTION1 | PRICE1 | NAME_EXPEDITION2 | PRICE_EXPEDITION2

Il serait possible d'optimiser cela afin d'obtenir :

TITRE1 | DESCRIPTION1 | PRICE1 | TABLEAU[NAME_EXPEDITIONn | PRICE_EXPEDITIONn]
mrocks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h41   #9
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Regarde du côté de GROUP_CONCAT, mais ce n'est pas standard SQL.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 19h08   #10
Invité régulier
 
Inscription : mai 2007
Messages : 39
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 39
Points : 8
Points : 8
Merci beaucoup pour le coup de main
mrocks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 07h58   #11
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 850
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 850
Points : 1 327
Points : 1 327
salut,

l'erreur était du au fait que ton select interne renvoyait plus d'une ligne de résultats or comme tu es à l’intérieur d'un autre select, il ne peut donc renvoyer qu'une ligne maximum. Les jointures sont toujours préférables à ce genre d'écriture car plus optimisées



Les jointures renvoient autant de ligne qu'il y a de chose renvoyées dans les 2 tables mises en jeu par rapport au critère de jointure (inner join).

Les left et right join vont te renvoyé au minimum le nombre de lignes sorties de la table de référence qui est à gauche (left) ou droite (right) de la jointure.

comme ça te l'a été dit si tu veux compacter tes résultats, tu devras faire un groupe by sur les colonnes de la tables de référence et un group_concat sur celles renvoyées par la jointure
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h27.


 
 
 
 
Partenaires

Hébergement Web