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 :

Select dans un select [MySQL-5.7]


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Points : 16
    Points
    16
    Par défaut Select dans un select
    Bonjour,

    J'ai un soucis avec une requête, elle fonctionne sous mysql 5.7.14 (en dev) mais pas sur mysql 5.7.10 (en prod), voici la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT auteur as qui,
    (SELECT MAX(maj) FROM action where auteur=qui) as maj,
    (SELECT COUNT(*) FROM action where auteur=qui) as total
    FROM action GROUP BY auteur ORDER BY auteur
    J'obtiens sur le serveur de dev :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     qui 	maj 	total 	
    auteur1 2018-12-18 	1
    auteur2 2018-12-20 	3
    auteur3 2018-12-18 	1
    auteur4 2018-12-21 	12
    auteur5 2018-12-19 	1
    auteur6 2018-12-18 	1
    Mais sur le serveur de prod, voici l'erreur : #1054 - Champ 'qui' inconnu dans where clause

    J'ai fait des recherches sur le net, apparemment il s'agit d'un pb de quote, j'ai fait des essais mais je ne trouve pas l'erreur... ??

    Merci de votre aide.

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Ou bien j'ai mal construis la requête ?

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    Vous pouvez faire simplement comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT auteur as qui,
        MAX(maj) as maj,
        COUNT(*) as total
    FROM action 
    GROUP BY auteur 
    ORDER BY auteur

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    J'avais testé mais j'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     qui 	maj 	total 	
    auteur1 2018-12-18 	1
    auteur2 2018-12-18 	1
    auteur3 2018-12-18 	1
    auteur4 2018-12-18 	1
    auteur5 2018-12-18 	1
    auteur6 2018-12-18 	1

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    très étrange...
    est-ce exactement cette requête que vous avez exécutée ?

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Arf effectivement ce n'était pas exactement cette requête, j'avais juste enlevé where auteur=qui dans les sous-select

    Hé bien c'est bien mieux !! votre requête fonctionne parfaitement !! je ne comprends pas pourquoi je m'étais pris la tête avec des sous-select...

    Merci bcp aieeeuuuuu, vous m'avez sauvé

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Désolé j'ai parlé trop vite !!! pour le forum j'avais simplifié la requête mais vous allez comprendre pourquoi j'avais mis des sous select, à partir du 3eme j'ai des conditions, voici la requête complète :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT auteur as qui,
    (SELECT MAX(maj) FROM action where auteur=qui) as maj,
    (SELECT COUNT(*) FROM action where auteur=qui) as total,
    (SELECT COUNT(*) FROM action WHERE realisation IS null AND auteur=qui) as encours,
    (SELECT COUNT(*) FROM action WHERE realisation IS NOT null AND auteur=qui) as finalisees,
    (SELECT COUNT(*) FROM action WHERE cloture IS NOT null and auteur=qui) as cloturees,
    (SELECT COUNT(*) FROM action WHERE efficacite = 'Oui'and auteur=qui) as efficacite,
    (SELECT COUNT(*) FROM action WHERE source = 'Locale' and auteur=qui) as sourcelocale,
    (SELECT AVG(DATEDIFF(realisation, demarrage)) FROM action WHERE realisation is not null and auteur=qui) as dureemoyenne,
    (SELECT COUNT(*) FROM action WHERE realisation is not null AND auteur=qui AND DATEDIFF(realisation, demarrage)>60) as sup60j,
    (SELECT COUNT(*) FROM action WHERE realisation is not null AND auteur=qui AND DATEDIFF(realisation, demarrage)>180) as sup180j
    FROM action GROUP BY auteur ORDER BY auteur

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Ton problème initial peut se résoudre simplement en utilisant des alias sur tes noms de table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  auteur AS qui
        ,   (SELECT MAX(tb2.maj) FROM action AS tb2 WHERE tb2.auteur = tb1.auteur)  AS maj
        ,   (SELECT COUNT(*) FROM action AS tb2 WHERE tb2.auteur = tb1.auteur)      AS total
    FROM    action  AS  tb1
    GROUP BY auteur
    ORDER BY auteur
    Ensuite, dans ta requête complète, tu multiplies les parcours de la table par le nombre d'agrégats à réaliser alors qu'il est possible de le faire en un seul passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  auteur AS qui
        ,   MAX(maj)        AS maj
        ,   COUNT(*)        AS total
        ,   SUM(CASE WHEN realisation IS NULL THEN 1 ELSE 0 END)   AS encours
        ...
        ,   AVG(CASE WHEN realisation IS NOT NULL THEN DATEDIFF(realisation, demarrage) END)    AS dureemoyenne
        ,   SUM(CASE WHEN realisation IS NOT NULL AND DATEDIFF(realisation, demarrage) > 60 THEN 1 ELSE 0 END) AS sup60j
        ...
    FROM    action
    GROUP BY auteur 
    ORDER BY auteur
    Et en prime, c'est plus joli
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Cette fois c'est la bonne, merci bcp AL1_24 !!

    Et je ne connaissais pas la technique des CASE WHEN, ça va me servir dans d'autres dév par la suite

    Bonnes fêtes à vous deux !!

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

Discussions similaires

  1. Selection d'une selection dans un filtre
    Par Swiper dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/07/2007, 19h26
  2. changement de formulaire sur selection dans le select
    Par LeXo dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 15/06/2006, 11h51
  3. select dans un select
    Par Terminator dans le forum Langage SQL
    Réponses: 7
    Dernier message: 20/10/2005, 18h23
  4. [firebird] sous select dans un select
    Par gdido dans le forum SQL
    Réponses: 2
    Dernier message: 14/05/2004, 09h57
  5. [Sybase] Select dans une select loop en C
    Par Claudio dans le forum Sybase
    Réponses: 2
    Dernier message: 29/04/2003, 18h06

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