Это в MySQL.Я создал следующий запрос, который возвращает желаемый ответ, но выглядит адски (и, вероятно, медленнее, чем мог бы быть).Есть ли способ упростить это?
select Status
, count(d.FruitType) as Count
, (select count(distinct FruitType) from Fruits) as TotalTypesOfFruit
from (select c.FruitType
, case
when sum(c.Eaten) > 4 then 'Popular'
else 'Not Popular'
end as Status
from (select a.*
, b.PieceID
, b.Size
, case
when b.Size > a.AvgSize then 1
else 0
end as Eaten
from Fruits a
left join Fruit_Pieces b
on a.FruitType = b.FruitType) c
group by c.FruitType) d
group by Status;
- Фрукты имеют список типов фруктов (FruitType) и их средний размер (AvgSize).
- Fruit_Pieces имеет список отдельных кусочков фруктов (PieceID), каждый из которых имеет FruitType и размер.
- Если размер каждого кусочка фрукта превышает AvgSize для его FruitType,тогда фрукты едят.
- Если съедено более 4 кусочков фруктов FruitType, то этот FruitType имеет статус «Популярный» (иначе «Не популярный»).
- Я хочу рассчитать количество "популярных" и "не популярных" FruitTypes, а также общее количество FruitTypes.
Для этого я создаю множество подзапросов.исключительно для целей расчета, чтобы я мог использовать этот расчет в большем подзапросе.Должен быть лучший способ.
РЕДАКТИРОВАТЬ:
Я упростил его до сих пор:
select Status
, count(c.FruitType) as Count
, (select count(distinct FruitType) from Fruits) as TotalTypesOfFruit
from (select a.FruitType
, case
when sum(
case
b.Size > a.AvgSize then 1
else 0
end) > 4 then 'Popular'
else 'Not Popular'
end as Status
from Fruits a
left join Fruit_Pieces b
on a.FruitType = b.FruitType
group by a.FruitType) c
group by Status
order by Status
Что все еще кажется не идеальным.Он более читабелен, но, кажется, не быстрее.