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 :

COUNT sur une Colonne et order by sur une autre


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Points : 451
    Points
    451
    Par défaut COUNT sur une Colonne et order by sur une autre
    Bonjour,

    J'ai recherché sur le forum et sur le web sans arriver à trouver une réponse à mon problème.
    J'ai des commentaires qui forment une sorte de chat, liés à une ou plusieurs visites client, qui dépendent donc d'un id visite et d'un id client, et qui s'ordonnent par date (vccom_updated_at)
    Si je fais :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT  c.raison, DATE_FORMAT(vccom_updated_at, '%d %b %Y à %T' ) as vccom_updated_at, vc.visite_id
    FROM visite_client_commentaire vcc
    LEFT JOIN user u ON u.id = vcc.vccom_user_id
    LEFT JOIN visite_client vc ON vc.id = vcc.vccom_vicl_id
    LEFT JOIN client c on c.id = vc.client_id
    WHERE vc.visite_id = 69086 AND vc.client_id = 5 
    ORDER by vcc.vccom_updated_at DESC
    J'ai la liste de mes commentaires pour une visite donnée et un client donné.
    Le but c'est d'avoir à la fois le nbr de commentaires sur une discussion (le COUNT des commentaires pour une visite et un client) et la date du dernier commentaire émis.
    Seulement, si je fais, à partir de la requête précédente (où vccom_id est l'id des commentaires):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT  COUNT (vccom_id) as nbr_commentaire , c.raison, DATE_FORMAT(vccom_updated_at, '%d %b %Y à %T' ) as vccom_updated_at, vc.visite_id
    FROM visite_client_commentaire vcc
    LEFT JOIN user u ON u.id = vcc.vccom_user_id
    LEFT JOIN visite_client vc ON vc.id = vcc.vccom_vicl_id
    LEFT JOIN client c on c.id = vc.client_id
    WHERE vc.visite_id = 69086 AND vc.client_id = 5 
    ORDER by vcc.vccom_updated_at DESC
    LIMIT 0,1
    J'ai bien le nombre de commentaires mais le 'order by desc' ne fonctionne plus et le vccom_updated_at en résultat contient la date du premier commentaire et plus du dernier.
    J'ai essayé avec des GROUP BY mais ça ne change rien.

    Quelqu'un aurait une idée ? (je me doute qu'il y a un tourne autour en plaçant le COUNT dans une sous-requête mais j'aimerai surtout comprendre le problème et voir s'il n'y a pas une solution plus simple et optimisée)
    Merci d'avance
    My daughter, my laptop, my bike and my double-sticks...

  2. #2
    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 789
    Points
    30 789
    Par défaut
    Pourquoi voudrais-tu que cette requête te donne des résultats cohérents ?
    La majorité des SGBD rejetterait cette requête. Dans la norme du langage SQL il est précisé que dans le cadre de l'utilisation d'un regroupement toutes les colonnes qui ne font pas l'objet d'une fonction de regroupement doivent être reprises dans la clause GROUP BY.
    MySQ s'affranchit de cette contrainte; En contrepartie les données retournées dans les colonnes qui ne sont pas regroupées sont choisies selon une logique non reproductible (on appelle cela aussi le hasard )
    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.

  3. #3
    Membre confirmé
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Points : 451
    Points
    451
    Par défaut
    Merci de ta réponse al1_24.
    Citation Envoyé par al1_24 Voir le message
    MySQ s'affranchit de cette contrainte; En contrepartie les données retournées dans les colonnes qui ne sont pas regroupées sont choisies selon une logique non reproductible (on appelle cela aussi le hasard )
    Je vois bien le problème.
    Après, pour avoir à la fois le regroupement dans le COUNT et sortir du regroupement pour l'ORDER BY, là je sèche.
    Citation Envoyé par al1_24 Voir le message
    il est précisé que dans le cadre de l'utilisation d'un regroupement toutes les colonnes qui ne font pas l'objet d'une fonction de regroupement doivent être reprises dans la clause GROUP BY.
    Je n'ai pas réussi à faire un group by qui me permette à la fois de conserver le résultat du COUNT et l'ordre sur la date.
    My daughter, my laptop, my bike and my double-sticks...

  4. #4
    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 789
    Points
    30 789
    Par défaut
    Peut-être faut-il commencer par te poser la question : s'il y a plusieurs dates, laquelle est à conserver ?
    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.

  5. #5
    Membre confirmé
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Points : 451
    Points
    451
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Peut-être faut-il commencer par te poser la question : s'il y a plusieurs dates, laquelle est à conserver ?
    La plus récente, pour avoir un message du style:

    x commentaire(s),
    Machin, le 26 Jui 2016 à 14h26 :
    (d'ou le
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER by vcc.vccom_updated_at DESC
    )
    My daughter, my laptop, my bike and my double-sticks...

  6. #6
    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 789
    Points
    30 789
    Par défaut
    Citation Envoyé par kalimukti Voir le message
    La plus récente...
    Est-ce que MAX(vcc.vccom_updated_at) ne renverrait pas cette date la plus récente ?
    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.

  7. #7
    Membre confirmé
    Avatar de kalimukti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 262
    Points : 451
    Points
    451
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Est-ce que MAX(vcc.vccom_updated_at) ne renverrait pas cette date la plus récente ?
    Aussi simple que ça !
    Du coup, je me sens un peu bête mais j'aurais appris un truc important parce que je vais avoir ce genre de requête à faire assez souvent.
    Merci beaucoup al1_24 ! Ca fonctionne très bien

    EDIT: et en plus, je comprends pourquoi ça marche: ça enlève le hasard dont tu parlais tout à l'heure... que du bonheur
    My daughter, my laptop, my bike and my double-sticks...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/05/2015, 10h23
  2. [AC-2010] État sur 1 colonne et sous-état sur 2 colonnes
    Par chris_ij32 dans le forum IHM
    Réponses: 7
    Dernier message: 17/01/2012, 22h51
  3. Réponses: 3
    Dernier message: 16/04/2009, 22h17
  4. Réponses: 4
    Dernier message: 31/10/2006, 19h03
  5. Réponses: 3
    Dernier message: 22/10/2006, 23h15

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