2017-12-02 220 views
0

首先,如果標題具有誤導性,我想表示歉意。MYSQL - 按名稱分組,幷包含結果中其他列的相應值

我有mysql表命名產品

+---------+-------+-----------+-------+ 
| name | price | date  | brand | 
+---------+-------+-----------+-------+ 
| apples | 2  | 02/12/17 | Tesco | 
| apples | 1.95 | 28/11/17 | Aldi | 
| apples | 2.5 | 29/11/17 | Lidl | 
| bananas | 0.5 | 01/12/17 | Tesco | 
| bananas | 0.7 | 29/11/17 | Aldi | 
| bananas | 1  | 25/11/17 | Lidl | 
+---------+-------+-----------+-------+ 

如果我想SELECT從該表中MAX價格,我會繼續前進,執行這個查詢:

SELECT 
    products.name AS NAME, 
    MAX(products.price) AS MAX_PRICE 
FROM products 
GROUP BY products.name; 

將輸出:

+---------+-----------+ 
| NAME | MAX_PRICE | 
+---------+-----------+ 
| apples | 2.5  | 
| bananas | 1   | 
+---------+-----------+ 

不過,我也想有這樣相應的日期和品牌在我的查詢輸出:

+---------+-----------+----------+-------+ 
| NAME | MAX_PRICE | DATE  | BRAND | 
+---------+-----------+----------+-------+ 
| apples | 2.5  | 29/11/17 | Lidl | 
| bananas | 1   | 25/11/17 | Lidl | 
+---------+-----------+----------+-------+ 

同樣將在SELECT語句MIN做:

+---------+-----------+----------+-------+ 
| NAME | MAX_PRICE | DATE  | BRAND | 
+---------+-----------+----------+-------+ 
| apples | 1.95  | 28/11/17 | Aldi | 
| bananas | 0.5  | 01/12/17 | Tesco | 
+---------+-----------+----------+-------+ 

怎麼可以這樣寫在MySQL

+0

這是一個常見問題有關解決方案的許多過去的問題,請參見[tag:greatest-n-per-group]標籤。 –

回答

0

我沒有我自己嘗試,但如果你將添加到最大的日期,並在group子句是這樣添加它 -

SELECT 
    products.name AS NAME, 
    MAX(products.price),MAX(products.date) AS MAX_date,BRAND 
FROM products 

GROUP BY products.name,products.date,BRAND ; 
0

MySQL有非標準的功能,使這些查詢比標準SQL更簡單:

SELECT 
    name AS NAME, 
    MAX(products.price) AS MAX_PRICE, date, brand 
    FROM products 
    GROUP BY name; 

它會隨機地從要獲取日期和品牌的子集中選擇一個元組。 如果從{姓名,價格}到{日期,品牌} 存在功能依賴關係,則這相當於將日期和品牌添加到羣組。

0

這樣做沒有group by。這裏有一種方法:

select p.* 
from products p 
where p.price = (select max(p2.price) from products p2 where p2.name = p.name); 

這不僅是正確的,但它可以在products(name, price)採取指數的優勢。

0

您只需要連接結果來獲取結果中的其他行。

SELECT p.name AS NAME,p.price AS MAX_PRICE, p.date as DATE, p.brand as BRAND 
FROM products p JOIN 
(
    SELECT brand, max(price) as brand_max_price 
    FROM products p 
    GROUP BY brand 
) t 
ON p.brand = t.brand AND p.price = t.brand_max_price; 
0

您可以通過再次向同一個表添加連接來重用自己的查詢。

SELECT Z.NAME, Z.MAX_PRICE, A.DATE, A.BRAND 
FROM 
products A 
INNER JOIN 
(SELECT products.name AS NAME, MAX(products.price) AS MAX_PRICE 
FROM products 
GROUP BY products.name) Z 
ON A.NAME = Z.NAME AND A.price = Z.MAX_PRICE; 
相關問題