【问题标题】:SQL Order Results Count by specific Query特定查询的 SQL 订单结果计数
【发布时间】:2021-02-15 14:40:58
【问题描述】:

我有一个包含以下数据的表格:

Snack 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

还有一张表格列出了每个孩子家乡杂货店的水果:

Child ID   |   Child Name   |  Local Fruit 1  | Local Fruit 2 |  Local Fruit 3 

1              Child A         Apple            Mango            Orange
2              Child B         Orange           Banana           Cherry
3              Child C         Banana           Mango            Apple

我需要为每个孩子吃的特定水果的数量从高到低排序结果,但前提是该水果是他们的家乡水果之一;

如果查询是“橙色”,我需要结果显示如下:

Hometown Orange Eaters (Highest to Lowest)

Child   |   Number of Fruits eaten

Child A     1
Child B     1

如果查询是“芒果”:

Hometown Mango Eaters

Child   |   Number of Fruits eaten

Child A     0
Child C     0

对于香蕉(孩子 A 没有展示,尽管香蕉吃得最多,因为这不是他们家乡的水果之一):

Hometown Banana Eaters

Child   |   Number of Fruits eaten

Child C     1
Child B     0

我目前使用的SQL命令如下:

select child, sum(fruit = '$fruit') `Number of fruits eaten`
from meals
group by child
order by `Number of fruits eaten` desc

但是,这只显示那些已经吃过水果的人的结果;例如对于香蕉示例,仅显示以下内容:

Hometown Banana Eaters

Child   |   Number of Fruits eaten

Child C     1

如何调整当前命令,以便显示所有“家乡水果”孩子,无论他们是否吃过所述水果?

【问题讨论】:

  • meals 是否与您的一张表相关?
  • 是的,第一张桌子是'餐'桌,谢谢
  • Local Fruit 1Local Fruit 2 等列是反模式。如果当地水果超过3个怎么办?您应该使用为每个 child ID + Local Fruit 组合具有单独行的表来规范您的架构。

标签: mysql sql count sql-order-by inner-join


【解决方案1】:

这是一种选择:

select child,
    (select count(*) from meals m where m.child = l.child and m.fruit = ?)  cnt
from listing l
where ? in (local_fruit_1, local_fruit_2, local_fruit_3)
order by cnt

逻辑是过滤listing 表中可以找到相关水果的行。然后,我们使用相关子查询来获取已吃水果的数量。

问号代表你想要分析的结果。

【讨论】:

    【解决方案2】:

    我认为这是join 和带有过滤的聚合:

    select s.child, sum(c.fruit = $fruit) as num_fruit
    from snacks s join
         child c
         on c.child_id = s.child
    where $fruit in (c.local1, c.local2, . . . )
    group by s.child
    order by num_fruit desc;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多