![](/img/trans.png)
[英]How to optimize SELECT some_field, max(primary_key) FROM table GROUP BY some_field
[英]select (sum(field) - max(field)) from table group by field
我有2張桌子:
CREATE TABLE IF NOT EXISTS `prodotti` (
`ID` smallint(3) NOT NULL,
`Denominazione` varchar(15) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `prodotti` (`ID`, `Denominazione`) VALUES
(111, 'latte'),
(222, 'uova');
CREATE TABLE IF NOT EXISTS `fornitori` (
`ID` int(3) NOT NULL,
`CF` varchar(5) NOT NULL,
`date` varchar(8) NOT NULL,
`Prezzo` int(3) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `fornitori` (`ID`, `CF`, `date`, `Prezzo`) VALUES
(111, 'AAAAA', '22/11/09', 100),
(222, 'AAAAA', '22/11/09', 200),
(222, 'BBBBB', '28/10/09', 400),
(111, 'CCCCC', '30/12/07', 100),
(222, 'CCCCC', '30/12/07', 200);
現在這是一些SQL查詢:
SELECT P.ID, COUNT(*)
FROM prodotti P,
(SELECT (SUM(Prezzo) - MAX(Prezzo)) AS T
FROM Fornitori
GROUP BY
prezzo
)F
WHERE F.T <200
GROUP BY
P.ID
但是我有一個問題
SELECT (
SUM( Prezzo ) - MAX( Prezzo )
) AS T
FROM Fornitori
這返回600
,但是為什么加上GROUP BY prezzo
,結果返回100 200 0
? WHERE FT <200
表示什么意思。
當您按Prezzo
分組時,對於每個不同的價格,您都會有一行,從Fornitori
的行匯總而來。 然后,對於每一行,計算Prezzo
的總和(最大值,因為您是按Prezzo
分組的,所以它只是單個項目的總和),最大值也是如此,然后將這兩個彼此相減。 如果沒有GROUP BY
,則所有行以及所有價格都將被匯總,您將得到ALL價格的總和減去ALL價格的最大值。
您遇到的問題是:為什么Prezzo
分組然后在其上使用聚合? 通常,您將一個或多個列分組,然后在其他列上使用聚合(即,不是您分組的列)。 在我看來,您可能希望按Prezzo
以外的其他類別進行分組,或者,如果您確實希望按Prezzo
進行分組(例如,獲取有關每個不同價格產品的信息),那么您希望進行匯總其他一些專欄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.