J'ai donc une table ici appelée my_table
| userid | gender | year | money |
| ------ | ------ | ---- | ----- |
| 1 | B | 12 | 50 |
| 1 | B | 24 | 150 |
| 1 | B | 36 | 5 |
| 1 | G | 0 | 0 |
| 1 | G | 12 | 120 |
| 1 | G | 48 | 120 |
| 2 | B | 12 | 23 |
| 2 | B | 24 | 56 |
| 2 | G | 36 | 23 |
| 3 | G | 0 | 234 |
| 3 | G | 12 | 34 |
| 4 | G | 0 | 0 |
Je veux renvoyer la ligne pour l'argent le plus élevé disponible en fonction du sexe. Ainsi, par exemple, la table de retour pour le sexe B sera comme
| userid | gender | year | money |
| ------ | ------ | ---- | ----- |
| 1 | B | 24 | 150 |
| 2 | B | 24 | 56 |
Et la table de retour pour le genre G sera comme
| userid | gender | year | money |
| ------ | ------ | ---- | ----- |
| 1 | G | 12 | 120 |
| 1 | G | 48 | 120 |
| 2 | G | 36 | 23 |
| 3 | G | 0 | 234 |
| 4 | G | 0 | 0 |
Mais comme la table pour le sexe G a une valeur en double, je veux qu'elle renvoie la ligne avec l'année la plus élevée. Le tableau attendu pour le sexe G est
| userid | gender | year | money |
| ------ | ------ | ---- | ----- |
| 1 | G | 48 | 120 |
| 2 | G | 36 | 23 |
| 3 | G | 0 | 234 |
| 4 | G | 0 | 0 |
Ce que j'ai essayé: http://sqlfiddle.com/#!9/5433cbc/2 Je suis en mesure d'obtenir le tableau pour le sexe B mais pas le genre G.
Ce que j'essaie de réaliser est de générer une table réunissant les deux tables de genre ci-dessus en une seule. Exemple,
| userid | year_b | max_money_for_b | year_g | max_money_for_g |
| ------ | ------ | --------------- | ------ | --------------- |
| 1 | 24 | 150 | 48 | 120 |
| 2 | 24 | 56 | 36 | 23 |
| 3 | null | null | 0 | 234 |
| 4 | null | null | 0 | 0 |
Je pense qu'une sous-requête corrélée est l'approche la plus simple de MySQL:
select t.*
from my_table t
where t.gender = 'G' and
(t.year, t.money) = (select t2.year, t2.money
from my_table t2
where t2.userid = t.userid and
t2.gender = t.gender
order by t2.money desc, t2.year desc
limit 1
);
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots