Besoin d'aide pour créer une requete SQL

Résolu
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

2 réponses

  1. 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
    1. Contributeur Ambassadeur
      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
      1. 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