Besoin d'aide pour créer une requete SQL
Résolu
roms75001
Messages postés
395
Date d'inscription
Statut
Membre
Dernière intervention
-
roms75001 Messages postés 395 Date d'inscription Statut Membre Dernière intervention -
roms75001 Messages postés 395 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je dois créer un système de concours photo.
Je m'explique :
Dans un concours on peut poster une photo, puis on peut voter.
La photo qui a le plus de vote est la gagnante.
J'aimerais créer mon propre système de "like".
Pour cela j'ai créé deux tables :
_____Comme vous pouvez le constater à chaque fois qu'il y a un nouveau participant, on lui défini un 'id'
Il faut savoir qu'il est possible de voter pour une photo sans participer (c'est pour ca qu'il y a un champ 'id_voteur' dans la table "vote")
A chaque fois que quelqu'un vote ca créé un nouvel id dans la table "vote"
Je veux donc créer une requête qui me retourne la "source_photo" du "concours_id" = 1 et qui a le plus de vote
Savez vous m'aider ?
Merci d'avance
Je dois créer un système de concours photo.
Je m'explique :
Dans un concours on peut poster une photo, puis on peut voter.
La photo qui a le plus de vote est la gagnante.
J'aimerais créer mon propre système de "like".
Pour cela j'ai créé deux tables :

Il faut savoir qu'il est possible de voter pour une photo sans participer (c'est pour ca qu'il y a un champ 'id_voteur' dans la table "vote")
A chaque fois que quelqu'un vote ca créé un nouvel id dans la table "vote"
Je veux donc créer une requête qui me retourne la "source_photo" du "concours_id" = 1 et qui a le plus de vote
Savez vous m'aider ?
Merci d'avance
A voir également:
- Besoin d'aide pour créer une requete SQL
- Créer un lien pour partager des photos - Guide
- Comment créer un groupe whatsapp - Guide
- Créer un compte google - Guide
- Créer une adresse hotmail - Guide
- Créer une liste déroulante excel - Guide
2 réponses
Bon pour ceux que ca intéresse j'ai trouvé la solution (surement pas la plus optimale) mais ça fonctionne :
Si quelqu'un aurait une solution plus optimisée je suis preneur :)
SELECT COUNT(*) AS nombre_vote, tmp.id_participation AS id_gagnant, tmp.source_photo AS img_gagnant FROM ( SELECT p.id AS id_participation, p.source_photo, p.concours_id FROM vote v JOIN participation p ON v.participation_idparticipation = p.id WHERE concours_id = '1' ) AS tmp GROUP BY id_participation HAVING nombre_vote = ( SELECT MAX(t2.nombre_vote) AS nombre_vote_max FROM( SELECT COUNT(*) AS nombre_vote, tmp.id_participation AS id_gagnant, tmp.source_photo AS img_gagnant FROM ( SELECT p.id AS id_participation, p.source_photo, p.concours_id FROM vote v JOIN participation p ON v.participation_idparticipation = p.id WHERE concours_id = '1' ) AS tmp GROUP BY id_participation ) AS t2 )
Si quelqu'un aurait une solution plus optimisée je suis preneur :)
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour, tu as donc des photos, des concours, des personnes et des votes.
tu ne décris pas clairement comment ces entités sont stockées dans tes tables.
si je comprends bien, tu as une table vote qui contient pour chaque vote, l'ID de la photo choisie. c'est exact?
et tu cherches, par concours, la photo ayant le plus de votes. c'est exact?
je pense que tu peux commencer par:
cela te donne, je pense, les votes par photo.
tu ajoutes ensuite un "order BY" pour classer par nombre de votes:
si cela fonctionne, tu ajoutes LIMIT, pour ne récupérer que le premier:
tu ne décris pas clairement comment ces entités sont stockées dans tes tables.
si je comprends bien, tu as une table vote qui contient pour chaque vote, l'ID de la photo choisie. c'est exact?
et tu cherches, par concours, la photo ayant le plus de votes. c'est exact?
je pense que tu peux commencer par:
SELECT count(*) as n_votes, p.id AS id_participation, p.source_photo, p.concours_id FROM vote v JOIN participation p ON v.participation_idparticipation = p.id WHERE concours_id = '1' GROUP BY id_participation, p.source_photo, p.concours_id
cela te donne, je pense, les votes par photo.
tu ajoutes ensuite un "order BY" pour classer par nombre de votes:
SELECT count(*) as n_votes, p.id AS id_participation, p.source_photo, p.concours_id FROM vote v JOIN participation p ON v.participation_idparticipation = p.id WHERE concours_id = '1' GROUP BY id_participation, p.source_photo, p.concours_id ORDER BY n_votes DESC
si cela fonctionne, tu ajoutes LIMIT, pour ne récupérer que le premier:
SELECT count(*) as n_votes, p.id AS id_participation, p.source_photo, p.concours_id FROM vote v JOIN participation p ON v.participation_idparticipation = p.id WHERE concours_id = '1' GROUP BY id_participation, p.source_photo, p.concours_id ORDER BY n_votes DESC LIMIT 1
Bonjour,
Merci pour ta réponse mais j'ai trouvé une solution beaucoup plus optimisé.
Pour ceux que ça intéresse la voici :
Merci pour ta réponse mais j'ai trouvé une solution beaucoup plus optimisé.
Pour ceux que ça intéresse la voici :
SELECT vote.participation_idparticipation, users.*, participation.source_photo FROM concours INNER JOIN participation ON participation.concours_id = concours.id INNER JOIN vote ON vote.participation_idparticipation = participation.id INNER JOIN users ON users.id_fb = participation.users_id_fb WHERE concours.id = 1 GROUP BY vote.participation_idparticipation HAVING COUNT(vote.participation_idparticipation) ORDER BY vote.participation_idparticipation DESC LIMIT 1