如何在查询各厂商最贵手机的SQL语句中获取phoneModel名称
你现有的SQL只能拿到厂商ID和对应最高售价,没法直接加phoneModel字段,是因为GROUP BY分组后,只有分组字段、聚合函数返回的结果是确定的,直接查询非分组非聚合的phoneModel,要么会触发SQL模式报错,要么返回的是随机匹配的型号,不是你要的最高售价对应的型号。
以下是几种可行的实现方案:
方案1:全数据库通用关联写法
所有主流数据库都支持该写法,同厂商下有多款售价相同的最高价手机时会全部返回:
SELECT p.companyId, p.phoneModel, p.price AS max_price FROM phone p INNER JOIN ( -- 先查询每个厂商的最高售价 SELECT companyId, MAX(price) AS max_price FROM phone GROUP BY companyId ) t ON p.companyId = t.companyId AND p.price = t.max_price;
方案2:支持窗口函数的数据库写法(MySQL8.0+、PostgreSQL、Oracle等)
用窗口函数实现逻辑更清晰,调整排序规则也更灵活:
WITH ranked_phone AS ( SELECT companyId, phoneModel, price, -- 按厂商分组,售价从高到低排序,同售价排名相同 RANK() OVER (PARTITION BY companyId ORDER BY price DESC) AS rk FROM phone ) -- 取每个厂商排名第一的就是最高价手机 SELECT companyId, phoneModel, price AS max_price FROM ranked_phone WHERE rk = 1;
如果同售价下只需要返回任意一个型号,可以把RANK()替换为ROW_NUMBER()即可。
方案3:MySQL5.x专属轻量写法
如果你的运行环境是MySQL5.x,且仅需要返回每个厂商任意一个最高价手机型号,可以用该写法:
SELECT companyId, SUBSTRING_INDEX(GROUP_CONCAT(phoneModel ORDER BY price DESC), ',', 1) AS max_price_model, MAX(price) AS max_price FROM phone GROUP BY companyId;
注意该写法受group_concat_max_len配置限制,型号名称过长或者同厂商型号过多时可能出现截断问题。
内容的提问来源于stack exchange,提问作者Сергей Гуков
相关产品推荐
相关产品推荐

