2017-12-02 380 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; 
相关问题