1.MYSQL满足条件函数里放查询最大函数的方法
在MySQL中,如果我们想要在一个条件函数(如CASE
)内部使用聚合函数(如MAX
)来获取某个字段的最大值,我们通常需要在外部查询或子查询中执行这个聚合操作,并将结果作为参数传递给条件函数。
以下是一个具体的代码示例,假设我们有一个名为sales
的表,它有两个字段:product_id
和sale_price
。我们想要找出每个product_id
的最大sale_price
,并在一个CASE
语句中根据这个最大值来决定如何显示一个额外的字段price_status
。
SELECT
product_id,
sale_price,
(
SELECT
CASE
WHEN sale_price = MAX(t2.sale_price) THEN 'Max Price'
ELSE 'Not Max Price'
END
FROM sales t2
WHERE t2.product_id = t1.product_id
) AS price_status
FROM sales t1
GROUP BY product_id, sale_price;
但是,请注意,上面的查询可能不会按我们期望的方式工作,因为它会为每个product_id
和sale_price
的组合返回一个price_status
。如果我们只想为每个product_id
返回一行,并且只显示最大sale_price
的price_status
为'Max Price',其他为'Not Max Price'(但这在这种情况下没有实际意义,因为我们只关心最大值),我们可以使用以下查询:
SELECT
t1.product_id,
t1.sale_price,
CASE
WHEN t1.sale_price = (SELECT MAX(sale_price) FROM sales t2 WHERE t2.product_id = t1.product_id) THEN 'Max Price'
ELSE 'Not Max Price' -- 这里实际上对于非最大值的行是多余的,因为我们不会显示它们
END AS price_status
FROM sales t1
INNER JOIN (
SELECT product_id, MAX(sale_price) AS max_sale_price
FROM sales
GROUP BY product_id
) t3 ON t1.product_id = t3.product_id AND t1.sale_price = t3.max_sale_price;
这个查询首先在一个子查询中为每个product_id
找到最大的sale_price
,然后在外部查询中通过INNER JOIN
来只选择那些具有最大sale_price
的行,并为它们设置price_status
为'Max Price'。其他行(如果有的话)将不会被选择,因此不需要为它们设置price_status
。
2.MySQL中使用CASE
语句和MAX
函数的代码示例
为了更好的理解,我们给出一些更具体的例子,展示了如何在MySQL中使用CASE
语句和MAX
函数。
2.1显示每个产品的最高售价和状态
假设我们有一个名为products_sales
的表,其中包含product_id
(产品ID)和sale_price
(售价)两个字段。我们想要显示每个产品的最高售价,并为其添加一个状态字段price_status
,表示是否为最高售价。
SELECT
p.product_id,
p.max_sale_price AS highest_sale_price,
CASE
WHEN p.max_sale_price IS NOT NULL THEN 'Max Price'
ELSE 'No Sales' -- 如果某个产品没有销售记录,则显示'No Sales'
END AS price_status
FROM (
SELECT
product_id,
MAX(sale_price) AS max_sale_price
FROM products_sales
GROUP BY product_id
) p;
2.2显示所有销售记录,并标记最高售价
如果我们想要显示所有销售记录,并标记哪些记录是对应产品的最高售价,我们可以使用子查询和JOIN
操作。
SELECT
s.product_id,
s.sale_price,
CASE
WHEN s.sale_price = (SELECT MAX(sale_price) FROM products_sales ps WHERE ps.product_id = s.product_id) THEN 'Max Price'
ELSE 'Not Max Price'
END AS price_status
FROM products_sales s;
2.3结合其他条件筛选销售记录
如果我们还想根据其他条件(如日期范围)筛选销售记录,并标记最高售价,我们可以这样做:
SELECT
s.product_id,
s.sale_price,
s.sale_date,
CASE
WHEN s.sale_price = (SELECT MAX(sale_price) FROM products_sales ps WHERE ps.product_id = s.product_id AND ps.sale_date BETWEEN '2024-01-01' AND '2024-5-26') THEN 'Max Price in 2024'
ELSE 'Not Max Price in 2024'
END AS price_status
FROM products_sales s
WHERE s.sale_date BETWEEN '2024-01-01' AND '2024-5-26';
在上面的例子中,我们仅考虑了2024年半年内截止今天(5月26日)的销售记录,并标记了哪些记录是对应产品在2024年半年内的最高售价。