1
votes

Ordre SQL par nombre de résultats

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é?


0 commentaires

4 Réponses :


1
votes

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 .


0 commentaires

1
votes

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


0 commentaires

1
votes
select Child, count(*) as 'Number of bananas eaten' from meals
where Fruit = 'Banana'
group by Child
order by count(*) desc

1 commentaires

Un de est manquant dans votre déclaration et quelques mots expliquant



0
votes

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;


0 commentaires