J'ai un tableau avec des données comme les suivantes:
$sql = "SELECT * FROM meals WHERE Fruit = 'Banana'";
et je dois classer les résultats, du plus élevé au plus bas, en fonction du fruit mangé, par exemple si la requête de recherche est Banana, les résultats s'afficheront comme suit:
Banana Eaters (Highest to Lowest) Child | Number of Bananas eaten Child A 3 Child C 1
Je commencerais par:
Meal ID | Child | Fruit 1 Child A Apple 2 Child B Orange 3 Child A Banana 4 Child A Orange 5 Child C Banana 6 Child A Banana 7 Child C Banana 8 Child A Banana
Mais comment trier les mangeurs de bananes individuels comme leur propre entrée, puis classer les résultats par ceux qui ont le plus mangé?
4 Réponses :
Regrouper par enfant et utiliser l'agrégation conditionnelle:
select child, sum(fruit = 'Banana') `Number of Bananas eaten` from meals group by child having `Number of Bananas eaten` > 0 order by `Number of Bananas eaten` desc
Si vous souhaitez exclure les enfants qui n'avaient pas de banane:
select child, sum(fruit = 'Banana') `Number of Bananas eaten` from meals group by child order by `Number of Bananas eaten` desc
Voir la démo .
cas d'utilisation lorsque
select child,sum(case when Fruit='Banana' then 1 else 0 end) as bananaeaten from meals group by child order by bananaeaten desc
select Child, count(*) as 'Number of bananas eaten' from meals where Fruit = 'Banana' group by Child order by count(*) desc
Un de est manquant dans votre déclaration et quelques mots expliquant
Si vous ne voulez pas voir "Enfant B", filtrez avant l'agrégation:
select Child, count(*) as num_bananas from meals where Fruit = 'Banana' group by Child order by count(*) desc;