MYSQL 我可以找到特定类别中值(value)最高的产品吗

标签 mysql sql greatest-n-per-group

我有一项任务,需要处理产品数据库,并且需要在运营商为 Sprint 的每个商店位置找到价格最高的手机。我想找到电话号码和ID。

I.E 我想找到每个 Sprint 手机 store.carrier = "Sprint"的phone.name 和phone.id,其中 item.price 是其商店中最大的。

我尝试了各种按 Max(price) 排序的 SQL 命令,然后尝试按品牌获取不同的值。

关系:

  • 商店(ID、名称、运营商)

  • 电话(ID、姓名、位置、价格)

哪里

  • store.id是store的主键。

  • product.id是产品的主键。

  • product.location 是引用 store.id 的外键。

我已经尝试过

    SELECT distinct phone.name, phone.id 
      FROM phone
      JOIN store ON phone.location = store.id
     WHERE store.carrier = 'sprint' 
     ORDER BY price DESC LIMIT 1;

也尝试过

    SELECT distinct phone.name, phone.id 
      FROM phone
      JOIN store ON phone.location = store.id
     WHERE store.carrier = 'sprint'
       AND phone.price >= (SELECT MAX 
                             FROM (SELECT MAX(price) 
                                     FROM phone 
                                    INNER JOIN store ON phone.location = store.id 
                            GROUP BY location)) 
     GROUP BY phone.id;

我期望的输出如下:

+-----+--------------------------+
| ID  |           NAME           |
+-----+--------------------------+
| 12  | iPhone XS MAX            |
| 97  | Samsung Galaxy S10 Plus  |
| 143 | iPhone XS MAX            |
| 163 | Google Pixel 3XL         |
| 194 | iPhone XS MAX            |
+-----+--------------------------+

相反,我会得到所有 Sprint 手机的列表,或者只是整体上最有值(value)的手机。

最佳答案

要获取前 1 行,您可以在子查询中使用递归迭代。然后在主查询中使用所有行排名值等于1来过滤掉:

 SELECT q.id phone_id, q.name phone_name, q.store_id
   FROM
   (
    SELECT p.id, p.name, p.location as store_id, p.price,
           @rn := IF(@store = p.location, @rn + 1, 1) AS phone_rank,
           @store := p.location as sto
      FROM phone p
      JOIN (SELECT @store := 1, @rn := 0) as q_iter
     WHERE EXISTS ( SELECT 1 FROM store s WHERE s.id = p.location and s.carrier ='sprint' ) 
     ORDER BY p.location, p.price DESC
    ) q
  WHERE phone_rank = 1  
  ORDER BY q.store_id;

Demo

关于MYSQL 我可以找到特定类别中值(value)最高的产品吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57193434/

相关文章:

mysql - 使用一个查询的结果作为变量输入到 MySQL 中的其他查询

sql - 如何在Oracle中为每个id用户提取前5行?

mysql - 选择不适合存储过程

mysql - MyIsam 表级锁定/死锁

php - 从谷歌地图中获取拖动的路线数据

mysql - 获取最后更新的行

sql - 返回字段编号最高的行的单个查询

mysql - 使用 WP 元查询按开始和结束日期显示自定义帖子类型

mysql - SQL查询: how to merge merge query with the most efficient way

java - 使用 Java 运行时 SQLCMD 不工作