首页 > 解决方案 > 分组时如何按最短字符串获取 MySQL 搜索结果?

问题描述

我有一个正在运行的查询:

SELECT a.* 
FROM a
GROUP BY a.prefixNumber
ORDER BY LENGTH(a.uniqueName) ASC, a.prefixNumber;

两行或多行数据可能包含相同prefixNumber的 形式ABC-123,但是它们将有一个唯一的名称prefixNumber。我想要uniqueName长度最短的 ,同时仍然能够按prefixNumber.

我猜当我执行该GROUP BY子句时会发生一些事情,但我不确定,因为我的 SQL 技能不是最高的。我一直在四处寻找,我找到了Length(a.uniqueName)解决方案。这似乎不能解决我的问题,因为在某些情况下我仍然会得到最长的名字。

灵魂?

标签: mysqlsql

解决方案


我了解到您希望prefixNumber通过选择最短的记录来删除 上的重复项uniqueName

我会使用NOT EXISTS而不是聚合:

SELECT a1.* 
FROM a a1
WHERE NOT EXISTS (
    SELECT 1 
    FROM a a2
    WHERE 
        a2.prefixNumber = a1.prefixNumber 
        AND LENGTH(a2.uniqueName) < LENGTH(a1.uniqueName)
)
ORDER BY a1.prefixNumber

NOT EXISTS条件使用相关子查询来确保没有其他具有相同prefixNumber且最短的记录uniqueName


在 MYSQL 8.0 中,您可以使用窗口函数,这些函数通常效率更高:

SELECT *
FROM (
    SELECT 
        a.*,
        ROW_NUMBER() OVER(PARTITION BY prefixNumber ORDER BY LENGTH(uniqueName)) rn
    FROM a
) x 
WHERE rn = 1

推荐阅读