IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Sous-requête avec plusieurs résultats souhaités


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 135
    Points : 69
    Points
    69
    Par défaut Sous-requête avec plusieurs résultats souhaités
    Bonjour,

    je parviens à faire une requête pour récupérer en tant que colonne 1 activité de mon contact (Acquéreur).

    Pour cela, je fais une sous requete sur entite_activites avec un LIMIT 0,1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT @acquereur_id:=acquereur.acq_id AS acquereur_id,agence.nom AS agence_nom,CONCAT( IFNULL(negociateur.nom, ""), ' ',  IFNULL(negociateur.prenom, "")) AS negociateur_nom,CONCAT( IFNULL(dr_civilite.valeur,' '), ' ',  IFNULL(acquereur.acq_nom,' '), ' ',  IFNULL(acquereur.acq_prenom,' ')) AS nom,acquereur.acq_cp AS acquereur_acq_cp,acquereur.acq_ville AS acquereur_acq_ville,
    (SELECT valeur FROM entite_informations WHERE id_entite=1 AND id_type_information = 2 AND id_fiche = @acquereur_id LIMIT 0,1) AS tel,
    (SELECT valeur FROM entite_informations WHERE id_entite=1 AND id_type_information = 1 AND id_fiche = @acquereur_id LIMIT 0,1) AS email,
    (SELECT valeur FROM entite_activites INNER JOIN dr_activite ON dr_activite.id=entite_activites.id_activite WHERE id_entite=1 AND id_fiche = @acquereur_id LIMIT 0,1) AS activites,
    acquereur.acq_apport_personnel AS acquereur_acq_apport_personnel
    FROM acquereur  LEFT JOIN agence ON acquereur.acq_id_agence=agence.id  
    LEFT JOIN negociateur ON acquereur.acq_id_negociateur=negociateur.id  
    LEFT JOIN dr_civilite ON acquereur.acq_id_civilite=dr_civilite.id 
    WHERE acquereur.acq_date_archivage='0000-00-00'  
    GROUP BY acquereur.acq_id
    ORDER BY acq_nom
    En réalité, je souhaiterai obtenir la liste de toutes les activités de mon contact et pas uniquement la première.

    Lorsque je retire le limit, MySQL provoque une erreur en m'indiquant
    Subquery returns more than 1 row
    .

    Pourriez-vous m'indiquer comment procéder ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    regardez du coté de la fonction group_concat

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    J'avais finalement trouvé la solution avec la requete suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT @acquereur_id:=acquereur.acq_id AS acquereur_id,agence.nom AS agence_nom,CONCAT( IFNULL(negociateur.nom, ""), ' ',  IFNULL(negociateur.prenom, "")) AS negociateur_nom,CONCAT( IFNULL(dr_civilite.valeur,' '), ' ',  IFNULL(acquereur.acq_nom,' '), ' ',  IFNULL(acquereur.acq_prenom,' ')) AS nom,acquereur.acq_cp AS acquereur_acq_cp,acquereur.acq_ville AS acquereur_acq_ville,(SELECT valeur FROM entite_informations WHERE id_entite=1 AND id_type_information = 2 AND id_fiche = @acquereur_id LIMIT 0,1) AS tel,acquereur.acq_apport_personnel AS acquereur_acq_apport_personnel,GROUP_CONCAT(dr_activite.valeur SEPARATOR ', ') AS liste_activites,GROUP_CONCAT(DISTINCT(entite_departements.id_departement) SEPARATOR ', ') AS liste_departements 
            FROM acquereur  LEFT JOIN agence ON acquereur.acq_id_agence=agence.id  LEFT JOIN negociateur ON acquereur.acq_id_negociateur=negociateur.id  LEFT JOIN dr_civilite ON acquereur.acq_id_civilite=dr_civilite.id  LEFT JOIN entite_activites ON entite_activites.id_fiche=acquereur.acq_id INNER JOIN dr_activite ON dr_activite.id=entite_activites.id_activite  LEFT JOIN entite_departements ON entite_departements.id_fiche=acquereur.acq_id 
             WHERE  entite_activites.id_entite=1 AND entite_activites.id_fiche=acquereur.acq_id AND entite_departements.id_entite=1 AND entite_departements.id_fiche=acquereur.acq_id AND  acquereur.acq_date_archivage='0000-00-00'     
            GROUP BY acquereur.acq_id
            ORDER BY acq_nom
    Seulement, comment faire pour ressortir également les acquéreurs qui n'ont pas d'activité ou pas de département de renseigné.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    J'ai déplacé ma clause au niveau du left join et fait un left join sur les activités puis un distinct sur les libelles activites

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT @acquereur_id:=acquereur.acq_id AS acquereur_id,agence.nom AS agence_nom,CONCAT( IFNULL(negociateur.nom, ""), ' ',  IFNULL(negociateur.prenom, "")) AS negociateur_nom,CONCAT( IFNULL(dr_civilite.valeur,' '), ' ',  IFNULL(acquereur.acq_nom,' '), ' ',  IFNULL(acquereur.acq_prenom,' ')) AS nom,acquereur.acq_cp AS acquereur_acq_cp,acquereur.acq_ville AS acquereur_acq_ville,(SELECT valeur FROM entite_informations WHERE id_entite=1 AND id_type_information = 2 AND id_fiche = @acquereur_id LIMIT 0,1) AS tel,acquereur.acq_apport_personnel AS acquereur_acq_apport_personnel,GROUP_CONCAT(DISTINCT(dr_activite.valeur) SEPARATOR ', ') AS liste_activites,GROUP_CONCAT(DISTINCT(entite_departements.id_departement) SEPARATOR ', ') AS liste_departements 
            FROM acquereur  
    LEFT JOIN agence ON acquereur.acq_id_agence=agence.id  
    LEFT JOIN negociateur ON acquereur.acq_id_negociateur=negociateur.id  
    LEFT JOIN dr_civilite ON acquereur.acq_id_civilite=dr_civilite.id  
    LEFT JOIN entite_activites ON entite_activites.id_fiche=acquereur.acq_id AND entite_activites.id_entite=1  LEFT JOIN dr_activite ON dr_activite.id=entite_activites.id_activite 
     LEFT JOIN entite_departements ON entite_departements.id_fiche=acquereur.acq_id AND entite_departements.id_entite=1
             WHERE   acquereur.acq_date_archivage='0000-00-00'     
            GROUP BY acquereur.acq_id
            ORDER BY acq_nom
    si quelqu'un voit une optimisation à faire ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SI la sous-requête retourne plusieurs résultats, ALORS
    Par italia57 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 17/09/2014, 14h45
  2. [AC-2007] Mettre à jour une une sous-form avec le résultat d'une autre requête
    Par courriervirtuel dans le forum Access
    Réponses: 1
    Dernier message: 21/10/2011, 09h17
  3. sous requête avec plusieurs lignes
    Par souarit dans le forum Bases de données
    Réponses: 0
    Dernier message: 09/02/2009, 01h18
  4. Sous requête avec plusieurs retours
    Par grunk dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/10/2007, 13h57
  5. [UPDATE]Sous-requetes avec plusieurs nuplets
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/07/2005, 18h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo