problème sql (maximum selon critère)

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : problème sql (maximum selon critère)

Re: problème sql (maximum selon critère)

par ouckileou » 29 juil. 2010, 10:59

Je pense que ton problème est explicitement résolu ici : "Select the top N rows from each group", bien que l'utilisation du count() et du group by sur image, question, reponse (ce qui me laisse penser encore une fois qu'il y a trop d'infos dans la même table) complexifie la chose.

Peux-tu nous donner le code SQL pour créer la table et la remplir avec tes données, j'aimerais bien tester avant de proposer qq chose.

Re: problème sql (maximum selon critère)

par eric » 28 juil. 2010, 17:07

s'il ya plusieurs réponses données pour une question d'une image, alors je veux récupérer les 2 réponses les plus citées

Re: problème sql (maximum selon critère)

par eric » 28 juil. 2010, 16:44

voila j'ai une table
qui contient les champs suivant (id_im,question,reponse ( les autres champs non rien à voir avec les requetes)
je fais la requete suivante :
select id_im,question,reponse,count(reponse) from ma_table
group by id_im,question,reponse

et j'obtiens un tableau comme ceci :

id_im question reponse count(reponse)
1 15 1 8
1 12 4 10
6 4 1 12
6 4 3 15
6 5 2 16
7 6 1 2

Re: problème sql (maximum selon critère)

par ouckileou » 28 juil. 2010, 16:22

J'ai l'impression que si pourtant... si tu nous donnes la requête que tu utilises pour obtenir les lignes avec :
id_image | id_question | nb_reponses

groupées par id_image, puis id_question et triées par nb_reponses, on pourra t'aider plus.

Re: problème sql (maximum selon critère)

par eric » 28 juil. 2010, 15:37

mais comme c'est pas tout à fait le meme problème que moi, je crains que pour le moment ça m'embrouille encore plus :oops:
:(

Re: problème sql (maximum selon critère)

par eric » 28 juil. 2010, 15:35

je suis entrain de le lire et d'essayer de comprendre

Re: problème sql (maximum selon critère)

par ouckileou » 28 juil. 2010, 15:27

Oublie mes requêtes, elles sont en rapport avec le schéma de tables que j'ai fait. Tu as lu l'article ?

Re: problème sql (maximum selon critère)

par eric » 28 juil. 2010, 15:18

je viens de tout bien lire mais je n'ai pas du tout compris.
En particulier la 3ème requete avec les inner join.
avec la configuration de mes tables, je peux récupérer la liste des images avec les numéros de questions possibles.
Il m'est alors également possible d'arriver à sélectionner les réponses possibles pour chaque question.
Par contre, pour ce qui vient après,c'est là queje bloque

Re: problème sql (maximum selon critère)

par ouckileou » 28 juil. 2010, 15:10

Non les deux premières sont des requêtes d'exemple, pour illustrer ma modélisation. La dernière (j'ai édité le commentaire) devrait te donner la meilleure réponse. Il suffit de virer le HAVING MAX pour obtenir le nombre de réponses pour chaque image/question.

Re: problème sql (maximum selon critère)

par eric » 28 juil. 2010, 15:04

le seul soucis que je vois dans tes requetes c'est que je dois faire ça pour chaque image et non pas en rentrant a la fin where id_image=...

:(

Re: problème sql (maximum selon critère)

par eric » 28 juil. 2010, 15:03

oui mais maintenant je dois essayer de programmer tout ça,ce qui est bien moins simple qu'en théorie.
je vais essayer de suivre ton raisonnement.
Merci encore,
j'espère que ça fonctionnera

Re: problème sql (maximum selon critère)

par ouckileou » 28 juil. 2010, 14:55

Si tu n'as pas des milliards d'images, de questions et de réponses, sortir tous les résultats triés et n'utiliser que les deux premiers via PHP n'est pas forcément idiot, pas sûr que ce soit beaucoup plus lent, tout en allégeant grandement la requête SQL (qui sera donc a priori plus rapide aussi, mais surtout plus simple à relire et maintenir si besoin :))

Re: problème sql (maximum selon critère)

par eric » 28 juil. 2010, 14:53

Merci beaucoup pour ta réponse, je vais essayer de comprendre tout ça et de l' adapter à mes tables.
Le nombre de réponses par question et par image n'est pas une colonne,je te rassure mais ça a été calculé avec un count.
j'ai un ensemble de tables assez complexe, donc j'ai résumé ce que j'ai réussi à obtenir en dernier.
Et sinon, oui j'utilise mysql avec wampserver(version de mysql : 5.1).Je fais les requetes simples pour tester avec phpmyadmin mais quand ça devient complexe comme ça,je fais tout sous forme de fonctions php.

Re: problème sql (maximum selon critère)

par ouckileou » 28 juil. 2010, 14:41

J'aurais bien eu une idée mais en regardant de plus pour moi il y a un problème de conception, "nombre réponse" ne devrait pas être une colonne, mais une donnée calculée, via le nombre de lien entre images, questions et réponses

image(id_image)
questions(id_question, libelle_question, id_image#)
reponses(id_reponse, libelle_reponse, id_question#)

reponses_donnees(id_question#, id_reponse#)

Ce qui nous donnerait les requêtes suivantes:
-- liste des questions pour une image
SELECT id_image, id_question, libelle_question
FROM questions
WHERE id_image = ?

-- liste des reponses possibles pour une question
SELECT r.id_reponse, r.libelle_reponse
FROM question q
INNER JOIN reponses r ON q.id_question = r.id_question
WHERE q.id_question = ?

-- la meilleure réponse pour une image (bon à tester)
SELECT id_image, id_question, COUNT(id_reponse)
FROM images i
INNER JOIN questions q ON i.id_image = q.id_image
INNER JOIN reponses_donnees rd ON q.id_question = rd.id_question
GROUP BY id_image, id_question
HAVING MAX(COUNT(id_reponse))
Dans l'optique de faire des stats, de relier à des utilisateurs etc cela serait plus logique, tu pourrais calculer ce que tu veux.

Mais bon ça c'était mon avis perso, pour ton soucis on partirait donc de là j'imagine :
SELECT id_image, id_question, id_reponse
FROM table t
ORDER BY id_image, id_question, id_reponse DESC
Et ensuite comme tu veux les deux premiers, ça devient complexe, on se dit qu'il va falloir bidouiller et utiliser les fonctions de MySQL (d'ailleurs je ne sais même pas si utilise MySQL vu que comme 98% des utilisateurs de ce forum tu ne l'as pas précisé)
Moi je n'ai pas trop envie de me casser la tête donc je me dis que quelqu'un l'a sûrement déjà fait avant moi et je tombe là dessus : http://www.xaprb.com/blog/2006/12/07/ho ... up-in-sql/

À mon avis, ça pourrait te mettre sur la piste :)

problème sql (maximum selon critère)

par eric » 28 juil. 2010, 14:18

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 :

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.