Besoin d'aide pour créer une requete SQL

Résolu/Fermé
roms75001 Messages postés 395 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 9 juillet 2017 - Modifié par roms75001 le 2/02/2017 à 13:23
roms75001 Messages postés 395 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 9 juillet 2017 - 3 févr. 2017 à 14:23
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
A voir également:

2 réponses

roms75001 Messages postés 395 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 9 juillet 2017 7
Modifié par roms75001 le 2/02/2017 à 15:55
Bon pour ceux que ca intéresse j'ai trouvé la solution (surement pas la plus optimale) mais ça fonctionne :

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 :)
0
yg_be Messages postés 23399 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 décembre 2024 Ambassadeur 1 556
Modifié par yg_be le 2/02/2017 à 17:25
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:
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
0
roms75001 Messages postés 395 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 9 juillet 2017 7
3 févr. 2017 à 14:23
Bonjour,

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
0