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

如何用SQL获取phone为789的唯一id_order对应行数据?

问题分析

你之前用 SELECT DISTINCT (id_order), * from table_name WHERE phone= "789"; 没得到期望结果,核心原因是DISTINCT 是对所有返回列的组合去重,不是只针对括号里的id_order。也就是说,只要id、id_order等列的组合有差异,就会被视为不同的行保留,所以同一id_order下的多条记录都会被返回,达不到你要的“每个唯一id_order留任意一行”的效果。

正确的SQL实现方案

下面给你几种通用的解决方案,适配不同的数据库版本:

方案1:窗口函数(推荐,支持MySQL 8+、PostgreSQL、SQL Server等)

用 ROW_NUMBER() 窗口函数给每个id_order分组内的行编号,然后只取每组的第一行:

SELECT id, id_order, name, phone, price
FROM (
    SELECT 
        *,
        -- 按id_order分组,每组内按id排序(也可以换成RAND()随机取)
        ROW_NUMBER() OVER (PARTITION BY id_order ORDER BY id) AS row_num
    FROM table_name
    WHERE phone = '789'
) AS temp_table
WHERE row_num = 1;

如果想随机获取每组的任意一行,把 ORDER BY id 换成 ORDER BY RAND() 即可(不同数据库的随机函数可能有差异,比如PostgreSQL用 RANDOM())。

方案2:子查询关联(适配老版本MySQL 5.x等不支持窗口函数的数据库)

先找到每个id_order对应的最小id(也可以用最大id),再关联原表获取整行数据:

SELECT t1.*
FROM table_name t1
INNER JOIN (
    SELECT id_order, MIN(id) AS target_id
    FROM table_name
    WHERE phone = '789'
    GROUP BY id_order
) AS t2 ON t1.id = t2.target_id
WHERE t1.phone = '789';

方案3:GROUP BY 聚合(仅当同一id_order下其他列值相同时适用)

如果你的数据里,同一id_order对应的name、phone、price都是相同的(比如你的示例数据),可以直接用GROUP BY结合聚合函数:

SELECT 
    MIN(id) AS id, -- 取任意一个id,也可以用MAX(id)
    id_order,
    name,
    phone,
    price -- 因为同一id_order下price相同,直接保留即可
FROM table_name
WHERE phone = '789'
GROUP BY id_order, name, phone, price;

内容的提问来源于stack exchange,提问作者Sourav Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:51:02