Giss


5165 messages

Vendredi 13 Mars 2009 - 19:50

Ca fait mal à la tête de lire ce poste après 19h et une longue journée de taf...
Je suis vraiment pas fais pour la prog !

nakuni


adjoint

11085 messages

Membre, Developpeur, LAN, Retraité, Chef (ED)

Lundi 16 Mars 2009 - 13:23 (post édité 4 fois)

lemonhead a écrit :
solution assez rapide à mon avis :

select num_quest, num_rp, count(*)
from reponses a
where num_util in ( select num_util
from reponses b
where b.num_quest=$question_en_cours
and b.num_quest=a.num_quest
and b.num_rp=$reponse_en_cours )
group by num_quest, num_rp



Finalement ta requête ne me donne pas ce que je recherche Confus

Pour le moment je suis arrêté sur ça:

SELECT r.num_quest, r.num_rp, count(*) as nb
FROM reponses r
WHERE r.num_util IN (SELECT num_util FROM reponses WHERE num_quest='.$question_en_cours.' AND num_rp='.$reponse_en_cours.')
AND (r.num_quest <> '.$question_en_cours.' OR r.num_rp <> '.$reponse_en_cours.')
GROUP BY num_quest, num_rp'
ORDER BY nb desc;


Ca me donne ce que je veux, mais le dernier OR je ne le comprend pas, logiquement ça devrait être un AND mais c'est le OR qui me donne le bon résultat, ça me fait chier de ne pas comprendre pourquoi.

 

rumpl


adjoint

1434 messages

Membre, Developpeur, LAN-MASTER, Retraité

Lundi 16 Mars 2009 - 13:32 (post édité 1 fois)

Parce que non(a ET b) = non(a) OU non(b)
De la logique de base.


Les choses qui méritent d'être faites méritent d'être mal faites.

T-oday I bake, to-morrow brew,
the next I'll have the young queen's child.
Ha, glad am I that no one knew
that Rumpelstiltskin I am styled.

nakuni


adjoint

11085 messages

Membre, Developpeur, LAN, Retraité, Chef (ED)

Lundi 16 Mars 2009 - 14:20

rumpl a écrit :
Parce que non(a ET b) = non(a) OU non(b)
De la logique de base.


Mais moi je veux non(a) ET non(b) Confus

 

Tompuce


703 messages

Lundi 16 Mars 2009 - 18:15

Juste une suggestion: avant d'optimiser une requête comme celle-là, il vaudrait mieux la décomposer, y aller par étape, comme un algo en sorte. Et puis comme Nakuni voulait un traitement côté serveur, alors l'algo SQL se transforme naturellement en procédure stockée.
Pour optimiser il faudra nous préciser si c'est en nombre de lignes genre "challenge pour les neurones" car souvent ça débouche sur des requêtes illisibles et inmaintenables, si c'est optimiser le temps de traitement ou l'affichage sur la page ça dépend de tellement de paramètres que le mieux c'est de faire des tests (en général une solution mix code + proc sql).

nakuni


adjoint

11085 messages

Membre, Developpeur, LAN, Retraité, Chef (ED)

Lundi 16 Mars 2009 - 18:20

Bah euh ce matin j'ai du mettre 2h pour en arriver là et ça fait exactement ce que je veux en une requête donc je n'y touche plus tant que je ne vois pas de bug Razz


 

Tompuce


703 messages

Lundi 16 Mars 2009 - 19:00

Pas de soucis. Je soumettais juste l'idée qu'un bon résultat n'est pas synonyme d'une requête juste. Mais si le résultat est juste après tout...

nakuni


adjoint

11085 messages

Membre, Developpeur, LAN, Retraité, Chef (ED)

Lundi 16 Mars 2009 - 19:29

Ahhhhh tu vas me donner mauvaise conscience Razz


 

nakuni


adjoint

11085 messages

Membre, Developpeur, LAN, Retraité, Chef (ED)

Mardi 17 Mars 2009 - 16:51 (post édité 1 fois)

Nakuni a écrit :

Ca me donne ce que je veux, mais le dernier OR je ne le comprend pas, logiquement ça devrait être un AND mais c'est le OR qui me donne le bon résultat, ça me fait chier de ne pas comprendre pourquoi.


OSEF du dernier OR, si tu ignore une question tu n'as pas à t'occuper de la réponse teubé de Fred de merde

Voici donc la bonne requête:

SELECT r.num_quest, r.num_rp, q.int_quest, rp.int_rp, count(*) as nb
FROM reponses r
JOIN questions q ON (r.num_quest = q.num_quest)
JOIN rep_possibles rp ON(r.num_rp = rp.num_rp)
WHERE r.num_util IN (SELECT num_util FROM reponses WHERE num_quest='.$question_en_cours.' AND num_rp='.$reponse_en_cours.')
AND (r.num_quest <> '.$question_en_cours.')
GROUP BY num_quest, num_rp
ORDER BY nb desc';

Cool

 

Tompuce


703 messages

Mercredi 18 Mars 2009 - 18:25

Peut-être une petite amélioration qui pourrait être utile pour le futur traitement du curseur dans le code php:
dans le ordre by d'abord trié sur le n° de question en croissant, puis sur le nb en décroissant ?
Si ce site est public une petite url pour voir le rendu ?

Tompuce


703 messages

Mercredi 18 Mars 2009 - 18:28

Et puis une petite question tu n'as pas d'erreur avec la syntaxe exacte que tu donnes ? Parce que dans le group by on retrouve normalement tous les attributs non agrégats: donc l'intitulé de question et l'intitulé de réponse que tu as ajouté dans la clause SELECT devraient en théorie compléter ton GROUP BY ???

lemonhead


dirigeant

18018 messages

Fondateur, Dirigeant, Membre, Developpeur, LAN-MASTER, Streamer, Corpo, Designer, Adjoint (ED)

Mercredi 18 Mars 2009 - 19:37

t'es viré Twisted Evil


« Lemon est vraiment un Malade... Heureusement qu'il est de notre côté.» (Guzmud)

« Lemon est fort, Lemon est beau, Lemon est sexy, Lemon est omniscient, Lemon est THE Lemon » (Violenconjugal)

« Lemon a un monde à lui dans sa tête » (Im_a_player)

« Putain, ca devient trop ce clan. Bientot on appelera Lemon le Parrain et le clan la Famille. Nawak » (Rumpl)

« Lemon est le seul mec qui préfère qu'on lui dise qu'il a une grosse femme plutôt qu'une grosse bite. » (Thrallscream)

« Lemon vient de me montrer... c'est ENORME !!! » (Seven)

« Lemon est un dieu, et Thrall a une.... enfin bon, je m'égare. » (Titi-fr)

nakuni


adjoint

11085 messages

Membre, Developpeur, LAN, Retraité, Chef (ED)

Mercredi 18 Mars 2009 - 19:43

Pourquoi trier d'abord sur le num je comprend pas? J'ai justement besoin d'avoir le nb comme critère de tri car je ne récupère que le premier résultat en fait, j'ai besoin du plus grand nbClin d

Pour le group by pas d'erreur de syntaxe là non.

Pour l'URL, quand ça sera en ligne sans pbClin d, pour le moment c'est un projet top secret que je fais sur mon temps libre au bureauClin d

Elle m'embrouille trop la tête cette requête, déjà j'ai du mal à expliquer le principe du site à mes "beta testeurs" lol


 

Tompuce


703 messages

Vendredi 20 Mars 2009 - 18:35

Trier en premier sur le num_quest permet d'obtenir un résultat type:
r.num_quest | r.num_rp | q.int_quest | rp.int_rp | count(*) as nb
1 2 bla bla 15
1 1 bla bla 9
1 3 bla bla 6
2 3 bla bla 37
2 1 bla bla 12
etc... Donc pour l'exploiter c'est rangé par num de question, puis à l'intérieur par réponse qui ont le plus de vote.

nakuni


adjoint

11085 messages

Membre, Developpeur, LAN, Retraité, Chef (ED)

Vendredi 20 Mars 2009 - 18:48

Bah ouai mais moi j'ai besoin de ça:

2 3 bla bla 37
1 2 bla bla 15
2 1 bla bla 12
1 1 bla bla 9
1 3 bla bla 6

D'ailleurs j'ai modifié mon ORDER BY comme ça pour gérer les égalités:
ORDER BY nb desc, rand()';


 

Liens utiles : Rechercher - Droits d'accès