[SQL] Problème de requête

Résolu
modjodandy Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
modjodandy Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai une table qui se présente de cette façon :



nom de la table : wp_votes

ID             post                  votes
------------------------------------------------
1                10                 ,2,3,4,5
2                11                ,2,3,4,5,6,7


post correspondant à l'ID d'un message
votes correspondant à l'ID des utilisateurs qui ont votés pour le message

Or, le score des messages n'est pas sauvegardé dans la base de donnée, et j'aimerai trouver un moyen pour comptabiliser le nombres de virgules dans la colonne "votes" afin d'ordonner ma requête et d'avoir le résultat suivant :

ID su message : 11 Score : 6
Id du message : 10 Score : 4

Merci de votre aide! C'est assez urgent ;)

4 réponses

SebManfred Messages postés 484 Date d'inscription   Statut Membre Dernière intervention   128
 
c'est sous quel SGBD?
c'est pour utiliser dans un programme, derrière, ou juste pour faire de l'affichage (genre PHP/MySQL)?
si tu as un moteur PL/SQL, ça pourrait résoudre ton problème.
0
modjodandy Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
C'est juste pour affichage php/mysql, j'avoue que je suis dessus depuis ce matin sans trouver de solution. Je suis une bille en requête sql (^-^)
merci à toi!
0
Utilisateur anonyme
 
Si ton champs votes est de type chaine de caractères tu peux faire :
SELECT LENGTH(votes)/2 FROM TA_TABLE
0
modjodandy Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
yes ça fonctionne! Le seul problème c'est que j'ai des nombres décimaux et pas de nombres entiers :

Id du post : 18 Score : 2.0000

Une solution pour virer cette jolie brochette de zéros?

au pire j'ai utilisé la fonction ceil() dans mon code PHP mais si il existe l'équivalant sql, je prends!
0
Utilisateur anonyme
 
Tu peux utiliser la fonction CEILING (arrondi par excès), FLOOR (arrondi par défaut) avec MySQL :
SELECT CEILING(LENGTH(votes)/2) FROM TA_TABLE
0
modjodandy Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup pour ton aide!!!
0
chantaussel Messages postés 137 Date d'inscription   Statut Membre Dernière intervention   30
 
Bonjour!

Je sais pas si ça va te servir (car tu es en passe de trouver une solution à ton problème), mais j'ai lu quelque part que dans une bdd c'était "pas le top" d'avoir plusieurs valeurs dans un même champ. (voir la discussion ici)
Je sais pas ce que ça vaut, mais il semblerait que ce soit mieux d'avoir une "table de liaison" du style:

id              post                       utilisateur ayant voté pour ce post
------------------------------------------------------------------------------------
1                10                                2
2                10                                3
3                11                                2

En fait tu es le dans le cas où tu as une "cardinalité n-n" car :
- chaque utilisateur peut voter pour plusieurs messages
- et chaque message peut être choisi par plusieurs utilisateurs
Et en cas de cardinalité n-n parait-il qu'une table de liaison fait bien l'affaire!

Du coup, après il te suffit de compter le nombre de fois où le message apparait dans la base pour avoir le score du message, et si un jour tu veux faire la liste des messages pour lesquels un même utilisateur à voté ce sera facile!

En espérant que ça soit utile
;)
0
modjodandy Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour cette précision, je vais creuser ça à la petite cuillère!
0