MySQL 包含带有 order by 的特定行

标签 mysql sql

给定 2 个表,我想从 [Purchase] 表中生成前 3 个最高金额。 附加条件是 [Crocs] 必须包含在前 3 条记录中。

我有以下SQL,但它无法生成我想要的结果(结果A),请指导我如何提取结果B中的结果。谢谢。

表(购买):

Purchase_ID | StoreID | Amount
------------|---------|--------
  1         |  21     |   22
  2         |  23     |   13
  3         |  25     |   6
  4         |  26     |   23
  5         |  28     |   18

表(商店):

Store_ID | StoreName     
---------|----------
  21     |  Adidas
  22     |  Nike
  23     |  Puma
  24     |  New Balance
  25     |  Crocs
  26     |  Converse

SQL:

SELECT IF(SUM(amount) IS NULL, 0, SUM(amount)) as totalAmount
FROM (
    SELECT a.amount
    FROM purchase a
    INNER JOIN store b
    ON a.store_id = b.storeid
    GROUP BY a.amount
    HAVING b.StoreName = 'Crocs'
    ORDER BY a.amount DESC
    LIMIT 3
) t

结果 A:$6

解释 A:Crocs 的数量为 6 美元

结果 B:51 美元

解释 B:前 3 名的总金额 = $22 (Adidas) + 23 (Puma) + $6 (Crocs)

最佳答案

scaisEdge 的答案几乎是正确的,但第一个查询也可能返回带有 crocs 的行,并且排序是错误的(order by max(a.amount) limit 2 意味着将显示最低的 2 个结果)。此外,您可以将查询包装在另一个选择查询中以对结果进行排序

  SELECT * FROM (
    SELECT b.storename, max(a.amount) as maxAmount
      FROM purchase a
      INNER JOIN store b ON a.store_id = b.storeid
      WHERE b.storename != 'crocks'
      GROUP BY a.storename
      ORDER BY max(a.amount) DESC 
      LIMIT 2
    UNION 
      SELECT b.storename, a.amount as maxAmount
      FROM purchase a
      INNER JOIN store b
      ON a.store_id = b.storeid
      WHERE b.storename='crocks'
      ORDER BY a.amount DESC
      LIMIT 1
  ) ORDER BY maxAmount DESC 

关于MySQL 包含带有 order by 的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38561098/

相关文章:

sql - 使用 sql 计算类型时间的总和

mysql - 如何在函数中使用 COUNT 结果而不返回它?

sql - 在允许通配符月/日但特定年份的 SQL 中查询

sql - Mysql语法帮助

sql - 在 Impala 中将数组列查询为行的解决方法

Mysql 根据其他列值将小数列返回为字符串值

Mysql DISTINCT 无法在我的语言中正常工作

mysql - VB net 2008 和 MySQL 上的连接字符串错误

java - oracle中如何向已有的自增表插入一行?

mysql - 使用父表删除子表中不需要的记录