我的表格中billID
是主键:
Invoice (billID, item, value, quantity)
以及以下查询:
SELECT item, sum(quantity) AS TotalItems
FROM Invoice
WHERE value>1
GROUP BY item
HAVING sum(quantity)>10
我只需要使用SELECT
,FROM
和WHERE
重写优化(或去优化?)。
GROUP BY
和HAVING
的新查询是什么?GROUP BY
& HAVING
仅使用SELECT
,FROM
和WHERE
?我的方法:
[1]我正在使用不同UNION
的{{1}}来实现这一目标。但主要问题是我需要事先了解所有items
。
item
还有其他方法可以获得结果吗?
答案 0 :(得分:6)
我们可以使用子查询并对每个项目的数量进行求和
SELECT A.item, A.Total
FROM
( SELECT distinct item,
(SELECT SUM(quantity)
FROM Invoice I2
WHERE I2.item = I1.item) Total
FROM Invoice I1
) A
where Total >10
答案 1 :(得分:1)
虽然我 从不 建议这样做,但MySql确实支持用户定义的变量。因此,从技术上讲,您可以重写查询以对变量中的项进行求和,建立行号以获得最大值,然后仅选择每组最高总数(每个项目):
select item, totalitems
from (
select
item, totalitems, @rn:=IF(@previtem=item,@rn+1,1) rn, @previtem:=item
from (
select item,
@qtytotal:=(IF(@previtem=item,@qtytotal+quantity,quantity)) totalitems,
@previtem:=item
from invoice, (select @qtytotal:=0, @previtem:='') t
where value > 1
order by item
) t, (select @rn:=0, @previtem:='') s
where totalitems > 10
order by item, totalitems desc
) t
where rn = 1
这是用仅使用select
,from
和where
的概念编写的 - 没有sum
等在技术上利用group by
或者{{1}}的聚合没有条款。