Bonjour, tout est dans le titre !
Pour les commentaires des articles, j'ai une table 'commentaires' avec notamment les champs id, date et commentaire :
J'ai une autre table 'votes' avec les champs id, comment (= id table commentaires) et vote
Le champ vote=1 est un vote pour, vote=0 est un vote contre.
Dans cet exemple le commentaire 1 a 2 votes pour, le comm 2 a 1 vote contre et le com 3 n'a pas de vote.
Avec la requête suivante, j'obtiens la liste des commentaires par date inverse :
Le problème c'est que les votes s'affichent aléatoirement. Je souhaiterait que les commentaires les mieux notés s'affichent en haut, les plus mal notés en bas, et les sans notes au milieu, donc d'après la table ci-dessus, le commentaire 1 puis le comm 3 et enfin le com 2.
La requête suivante me donne les commentaires les mieux notés, les plus mal notés et enfin le reste :
Dans l'idéal je souhaiterais que :
Et c'est la que je patauge. J'ai fait des essais avec des group by, des cases, des sum, sans aucun résultat.
Je me doute qu'il faut additionner tous les commentaires de la table 'commentaires' (un SUM(*) sur cette table?), puis additionner tous ceux dont la valeur est 1, puis tout ceux dont la valeur est 0, puis en déduire ceux qui n'ont aucune valeur et enfin les trier.
Mais je n'ai aucune idée de la façon de le faire. Une piste please?
Merci

Pour les commentaires des articles, j'ai une table 'commentaires' avec notamment les champs id, date et commentaire :
Code:
------------------------------------------
ID | DATE | COMMENTAIRE |
------------------------------------------
1 | 12/10 | comm 1 |
------------------------------------------
2 | 12/10 | comm 2 |
------------------------------------------
3 | 13/10 | comm 3 |
------------------------------------------
J'ai une autre table 'votes' avec les champs id, comment (= id table commentaires) et vote
Le champ vote=1 est un vote pour, vote=0 est un vote contre.
Code:
------------------------------------
ID | COMMENT | VOTE |
------------------------------------
1 | 1 | 1 |
------------------------------------
2 | 2 | 0 |
------------------------------------
3 | 1 | 1 |
------------------------------------
Avec la requête suivante, j'obtiens la liste des commentaires par date inverse :
Code:
SELECT * FROM commentaires WHERE (je vérifie que le com. corresponde à l'article) ORDER BY date DESC
Le problème c'est que les votes s'affichent aléatoirement. Je souhaiterait que les commentaires les mieux notés s'affichent en haut, les plus mal notés en bas, et les sans notes au milieu, donc d'après la table ci-dessus, le commentaire 1 puis le comm 3 et enfin le com 2.
La requête suivante me donne les commentaires les mieux notés, les plus mal notés et enfin le reste :
Code:
SELECT * FROM commentaires AS c LEFT JOIN votes AS v ON v.comment=c.id WHERE (je vérifie que le com. corresponde à l'article) ORDER BY v.vote DESC, date DESC
Dans l'idéal je souhaiterais que :
- les commentaires les mieux notés (si la somme de ses votes pour est supérieure à celle des contres) apparaissent en haut puis régressivement
- les commentaires sans note (donc sans entrée dans la table vote), au milieu
- les commentaires les plus mal notés (si la somme de ses votes contre est supérieure à celle des pour) apparaissent en bas
- cerise sur le gâteau, les derniers commentaires des dernières x heures apparaissent en haut (peut importe leur vote) puis cèdent leur place. Mais je me contenterais des 3 premiers points.
Et c'est la que je patauge. J'ai fait des essais avec des group by, des cases, des sum, sans aucun résultat.
Je me doute qu'il faut additionner tous les commentaires de la table 'commentaires' (un SUM(*) sur cette table?), puis additionner tous ceux dont la valeur est 1, puis tout ceux dont la valeur est 0, puis en déduire ceux qui n'ont aucune valeur et enfin les trier.
Mais je n'ai aucune idée de la façon de le faire. Une piste please?
Merci
