2017-09-27 2 views
0

Supposons que la structure de la table MYSQL donnéeMysql - Obtenez une valeur distincte sur un champ commandé par un autre champ

+----+-------+-------+ 
| id | group | count | 
+----+-------+-------+ 
| 1 | cat | 11 | 
| 2 | cat | 12 | 
| 3 | dog |  4 | 
| 4 | dog |  6 | 
| 5 | cow | 16 | 
| 6 | cow | 12 | 
+----+-------+-------+ 

Ce que je veux faire est: Prendre un animal par groupe d'animaux, commandé par le champ de comptage croissant. Dans l'exemple ci-dessus, la sortie doit être:

| 1 | cat | 11 | 
| 3 | dog |  4 | 
| 6 | cow | 12 | 

Mais il est plus que ça en al'air complexe comme. Quelle est la requête la plus optimisée pour obtenir ces résultats? (Bien sûr, faire un sous-requête pour chaque groupe n'est pas une option)

Répondre

0

De MySQL 8.0+ vous pouvez utiliser ROW_NUMBER():

SELECT * 
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY `group` ORDER BY `count`) AS rn 
    FROM table_name) sub 
WHERE rn = 1; 

DBFiddle Demo

+0

@MKhalidJunaid MySQL devient moderne. Il prendra en charge les fonctions CTE/fenêtrées à partir de la version 8 et supérieure. – lad2025

+0

Merci pour votre réponse, mais la version de mysql que je veux viser est bien au-dessus;) –

2

conformément au manuel ...

SELECT x.* 
    FROM my_table x 
    JOIN 
    (SELECT `group`, MIN(count) count FROM my_table GROUP BY `group`) y 
    ON y.group = x.group 
    AND y.count = x.count; 
+0

Merci pour votre requête, mais un problème reste: Si les animaux du même groupe ont le même nombre, ils les prendront tous. La requête doit contenir exactement un animal par groupe. –

+0

@AdamS Lequel? – Strawberry

+0

Peu importe, les critères peuvent être n'importe quoi, même rand. –