Page 1 sur 1

SELECT multiple, lier 2 tables et les afficher par ordre

Posté : 10 févr. 2021, 23:13
par two3d
Salut,

je galère à trouver des tutos sur mon problème (je suis preneur pour des tutos), je vous explique:

J'ai sur mon site, un concours à 10 places, et les utilisateurs classés dans le concours avec leur "points".

J'ai donc une table "concours" avec les places et les gains, comme ceci:
table concours:
place (entier)
gain (varchar)
table users:
id (entier)
name (varchar)
points (entier)

J'ai fait la requête suivante mais elle m'affiche deux fois les résultats quand il y a deux participants avec plus de 0 points:
SELECT

	TBL_concours.*,TBL_users.name as name,TBL_users.points as points 

FROM 

	TBL_concours
	
JOIN

	TBL_users
	
WHERE

	points>0

	
GROUP BY

	TBL_users.name

ORDER BY

	TBL_concours.place,points DESC
Je souhaite évidement lister les places de 1 à 10 et classer les utilisateurs par leur points

Re: SELECT multiple, lier 2 tables et les afficher par ordre

Posté : 12 févr. 2021, 18:10
par Ryle
Salutations !

Je suppose que ta table concours contient 10 valeurs avec un chiffre allant de 1 à 10 dans la colonne place ? Le problème c'est qu'il n'y a aucun lien entre cette table et le résultat de ton concours pour permettre de faire une jointure retournant un gain par utilisateur.

Le plus simple est de faire deux requêtes, l'une de tes prix (que tu colles dans un tableau en php) et l'autre de tes 10 meilleurs participants. Il suffit ensuite dans la boucle qui affichera les résultats de prévoir un compteur te permettant d'aller chercher le prix correspondant dans le tableau php que tu auras initialisé au préalable :)

Ensuite s'il est vraiment nécessaire de tout faire dans une seule requête SQL et que tu utilises une version de mysql supérieure à 8, tu as une fonction row_number() qui te permet d'insérer le numéro séquentiel de l'enregistrement dans une requête SQL. Tu peux ainsi faire un select retournant tes 10 meilleurs utilisateurs (en les triant en fonction de leur nombre de point et en limitant la liste aux 10 premiers) en incluant ce numéro séquentiel en guise de "place". Tu pourras alors faire une jointure entre cette colonne et ta table de gains.

Et si ta version de mysql est inférieure à 8, la fonction peut être émulée via une variable dans la requête, mais ça complique quand même beaucoup les choses sans que ça en vaille vraiment la peine :)

Re: SELECT multiple, lier 2 tables et les afficher par ordre

Posté : 12 févr. 2021, 19:35
par two3d
Salutations !
Je suppose que ta table concours contient 10 valeurs avec un chiffre allant de 1 à 10 dans la colonne place ?
Oui
Le problème c'est qu'il n'y a aucun lien entre cette table et le résultat de ton concours pour permettre de faire une jointure retournant un gain par utilisateur.
Oui, c'est un peu biscornu
Le plus simple est de faire deux requêtes, l'une de tes prix (que tu colles dans un tableau en php) et l'autre de tes 10 meilleurs participants. Il suffit ensuite dans la boucle qui affichera les résultats de prévoir un compteur te permettant d'aller chercher le prix correspondant dans le tableau php que tu auras initialisé au préalable :)
C'est exactement ce que j'ai fait! solution simple et efficace
Ensuite s'il est vraiment nécessaire de tout faire dans une seule requête SQL et que tu utilises une version de mysql supérieure à 8, tu as une fonction row_number() qui te permet d'insérer le numéro séquentiel de l'enregistrement dans une requête SQL. Tu peux ainsi faire un select retournant tes 10 meilleurs utilisateurs (en les triant en fonction de leur nombre de point et en limitant la liste aux 10 premiers) en incluant ce numéro séquentiel en guise de "place". Tu pourras alors faire une jointure entre cette colonne et ta table de gains.
Powah, trop bien mais j'ai pas la 8, merci pour l'info!

Je reste avec mon tableau PHP, plus simple et fait le job! Merci