Mysql
 sql >> Base de données >  >> RDS >> Mysql

Retourner un Min() et un autre champ ?

Le truc est le suivant :toute fonction d'agrégat "ne se soucie pas" du reste de sa ligne. Si ce n'était pas MIN mais SUM, c'est plus facile à voir...

La solution est un peu délicate, vous devriez faire quelque chose qui implique LEFT JOIN avec une inégalité :

SELECT u.username, l.timer AS intScore, l.hashtag

FROM
 leaderboard l
 INNER JOIN users u ON u.users_id = l.users_id
 LEFT JOIN leaderboard l2 ON l.users_id = l2.users_id AND l2.timer < l.timer
WHERE
 l2. users_id IS NULL
ORDER BY intScore ASC

L'idée est d'obtenir la valeur la plus basse en sautant la fonction MIN et en obtenant la ligne entière

Le filtrage par date (ou toute autre colonne / critère d'ailleurs) à partir du tableau des classements nous obligera à filtrer chaque tableau que nous utilisonsIl est important de filtrer le tableau LEFT JOINed à la condition ON, sinon nous éliminons l'effet de filtrage NULL :

SET @date0 = '2018-01-01';
SELECT u.username, l.timer AS intScore, l.hashtag

FROM
 leaderboard l
 INNER JOIN users u ON u.users_id = l.users_id
 LEFT JOIN leaderboard l2 ON l.users_id = l2.users_id AND l2.timer < l.timer AND l2.game_date >= @date0
WHERE
 l.game_date >= @date0
 l2.users_id IS NULL
ORDER BY intScore ASC

j'espère que ça aide