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   -
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   Statut Membre Dernière intervention   7
 
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 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:
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   Statut Membre Dernière intervention   7
 
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