MySQL按列分组选择具有最大列值的行

MySQL按列分组选择具有最大列值的行

在本文中,我们将介绍如何使用MySQL语句按列分组选择具有最大列值的行,同时按另一列进行分组。这种类型的查询通常用于从表中选择唯一值,例如每个类别中的最高销售量产品。

阅读更多:MySQL 教程

准备

为了更好地理解本教程,请使用本地服务器或MySQL工具(例如phpMyAdmin)创建表格并填充示例数据。对于此教程,我们将使用以下“products”表格:

CREATE TABLE products (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(100) NOT NULL,
  category varchar(50) NOT NULL,
  price decimal(10, 2) NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO products (name, category, price) VALUES 
('Product 1', 'Category 1', 50.00),
('Product 2', 'Category 1', 70.00),
('Product 3', 'Category 1', 80.00),
('Product 4', 'Category 2', 45.00),
('Product 5', 'Category 2', 55.00),
('Product 6', 'Category 2', 65.00),
('Product 7', 'Category 3', 40.00),
('Product 8', 'Category 3', 80.00),
('Product 9', 'Category 3', 120.00);

选择每个类别中最高价格的产品

为了选择每个类别中价格最高的产品,我们需要使用MAX()函数和GROUP BY子句。以下示例将返回每个类别中具有最高价格的产品:

SELECT category, MAX(price) as max_price 
FROM products 
GROUP BY category;

这将返回以下结果:

category max_price
Category 1 80.00
Category 2 65.00
Category 3 120.00

该查询首先使用GROUP BY子句按“category”列对产品进行分组。然后,MAX()函数用于计算每个组中price列的最大值。使用AS子句重命名结果集以更好地理解输出。

选择每个类别中最高价格的产品的完整行

要选择每个类别中价格最高的产品的完整行,我们需要与原始products表格进行连接(使用它的ID列作为键)。以下示例将返回每个类别中价格最高的产品的完整行:

SELECT * 
FROM products 
INNER JOIN (
  SELECT category, MAX(price) as max_price 
  FROM products 
  GROUP BY category
) grouped_products 
ON products.category = grouped_products.category 
AND products.price = grouped_products.max_price

这将返回以下结果:

id name category price category max_price
3 Product 3 Category 1 80.00 Category 1 80.00
6 Product 6 Category 2 65.00 Category 2 65.00
9 Product 9 Category 3 120.00 Category 3 120.00

该查询使用INNER JOIN子句将原始products表格与子查询中计算的每个类别中最高价格的产品连接。该子查询使用MAX()函数和GROUP BY子句按类别计算价格最高的产品。ON子句用于连接category列中的值和价格最高的产品的类别列。最后,使用SELECT *来选择结果集的所有列。

总结

MySQL语句按列分组选择具有最大列值的行,同时按其他列进行分组,这是一种常见的查询类型,用于选择唯一值。使用MAX()函数和GROUP BY子句可以轻松计算每个组中具有最高列值的行。如果需要选择完整的行,可以使用连接将原始表格与子查询连接起来。希望本文对您的MySQL查询有所帮助!

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程