You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在查询各厂商最贵手机的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,提问作者Сергей Гуков

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:39:02