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 :

Problème maximum selon critère


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 16
    Points : 12
    Points
    12
    Par défaut Problème maximum selon critère
    Bonjour à tous,

    Je galère un peu sur une requête alors si quelqu'un pouvait m'aider ça serait vraiment sympa.
    Je vous explique mon problème, j'ai une table qui contient des identifiants d'image, ainsi que des identifiants de questions.

    Je souhaiterais sélectionner pour chaque image (id_image), et pour chaque question (id_question), la réponse la plus fréquemment donnée et la suivante.
    Par exemple si dans ma table j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id_image   id_question   id_reponse  nb_reponses 
    1          3             5           10
    1          3             6            9
    1          3             4            8
    Pour l'image 1, à la question 3, on a répondu 10 fois la réponse 5, 9 fois la réponse 6 et 8 fois la réponse 4.
    Je souhaiterais pouvoir récupérer les deux premières lignes (les réponses que l'on a répondu 10 et 9 fois).

    Si quelqu'un a une idée, car là moi je ne vois pas du tout.
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Quelle requête avez-vous essayé ?
    Quel est votre SGBD ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Pour le moment j'ai juste écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      select id_image, id_question, reponse, count(reponse)
        from ma_table
    group by id_image, id_question, reponse
    Je souhaiterais utiliser cette base et écrire une requête en PHP, mais je ne vois pas du tout comment faire en fait.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous n'avez pas répondu sur votre SGBD. C'est important pour la syntaxe.

    Que voulez-vous faire en cas d'égalité, par exemple si votre requête renvoyait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id_image   id_question   id_reponse  nb_reponses 
    1          3             5           10
    1          3             6           10
    1          3             4            8
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id_image   id_question   id_reponse  nb_reponses 
    1          3             5           10
    1          3             6            9
    1          3             4            9

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    je n'ai pas trop compris les précisions que je pouvais apporter de plus, j'utilise wampserver,une version 5.1 de mysql,et je visualise les résultats de mes requetes soit directement avec phpmyadmin quand c'est une requete simple soit à l'aide de mon programme php

    Pour la réponse concernant l'égalité, ben je souhaiterais prendre les deux premiers ex aequo.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est la première fois que vous parlez de wampserver ou de mysql, et c'était effectivement la réponse que j'attendais !

    Ok pour le premier cas particulier, vous prenez les deux réponses à 10.
    Mais pour le second cas ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    désolée pour le manque de précision technique du début, je n'avais pas compris la question sur le coup.Et je suis aussi un peu débutant.
    Pour le second cas, c'est effectivement une très bonne question,je pense qu' il me faudrait peut etre prendre l'un des deux meme si ce serait totalement arbitraire.
    Mais à terme,j'aimerais obtenir un classement général avec le nombre de réponses pour chacune des questions.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je laisse les pros de MySQL reprendre le sujet !

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Sous MySQL, on ne dispose pas des fonctions de fenêtrages, très pratiques pour régler ce genre de problème.
    Du coup, il faut contourner la difficulté en passant par l'usage d'une sous-requête, en faisant une division relationnelle.

    Pour commencer, s'il n'y a pas d'égalité dans le nombre des réponses pour une même image et une même question entre des réponses différentes, voici la requête qui ramène les 2 réponses les plus données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t.id_image, t.id_question, t.id_reponse, t.nb_reponses
    FROM ma_table t
    WHERE (
      SELECT COUNT(*)
      FROM ma_table t2
      WHERE t2.id_image = t.id_image
      AND t2.id_question = t.id_question
      AND t2.nb_reponses > t.nb_reponses
    ) < 2
    Si jamais il y a égalité sur certaines réponses, voici une requête qui ramène les 2 réponses les plus données ou, en cas d'égalité, celle dont l'id est le moins élevé (ce qui ne revient pas tout à fait à du hasard, mais permet de mieux contrôler le résultat) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT t.id_image, t.id_question, t.id_reponse, t.nb_reponses
    FROM ma_table t
    WHERE (
      SELECT COUNT(*)
      FROM ma_table t2
      WHERE t2.id_image = t.id_image
      AND t2.id_question = t.id_question
      AND (t2.nb_reponses > t.nb_reponses
        OR (t2.nb_reponses = t.nb_reponses AND t2.id_reponse < t.id_reponse)
      )
    ) < 2
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  10. #10
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT id_image, id_question, reponse, count(reponse) as compte
    FROM ma_table
    GROUP BY id_image, id_question
    ORDER BY compte desc
    LIMIT 2
    A la recherche d'un film : http://chercher-un-film.com

  11. #11
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par m4riachi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT id_image, id_question, reponse, count(reponse) as compte
    FROM ma_table
    GROUP BY id_image, id_question
    ORDER BY compte desc
    LIMIT 2
    Cette requête fonctionne dans le cas bien particulier de l'exemple donné, mais ne renverra pas un résultat "pour chaque image et pour chaque question", ce qui est demandé dans le cas présent .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  12. #12
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Autre façon de procéder, sans passer par une sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t.id_image, t.id_question, t.id_reponse, t.nb_reponses, COUNT(*) AS ordre
    FROM ma_table t
    INNER JOIN ma_table t2 
        ON t2.id_image = t.id_image AND t2.id_question = t.id_question
           AND (t2.nb_reponses > t.nb_reponses 
              OR (t2.nb_reponses = t.nb_reponses AND t2.id_reponse < t.id_reponse)
           )
    GROUP BY t.id_image, t.id_question, t.id_reponse
    HAVING COUNT(*) <= 2
    Je n'ai pas testé, mais ça devrait fonctionner (à peu de choses près )

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. Problème de tri selon critères
    Par JeanMikael dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/07/2007, 19h00
  2. [Etat] Problème de conception d'un état (selon critères)
    Par The_Super_Steph dans le forum IHM
    Réponses: 2
    Dernier message: 06/06/2007, 13h07
  3. Réponses: 7
    Dernier message: 29/06/2006, 11h11
  4. problème recherche multi critère
    Par jeck dans le forum Access
    Réponses: 3
    Dernier message: 16/05/2006, 10h42
  5. Problème recherche sur critère
    Par Sendo dans le forum Access
    Réponses: 1
    Dernier message: 08/03/2006, 00h51

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