如何在分组时通过最短字符串获取MySQL搜索结果?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在分组时通过最短字符串获取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)解决方案。这似乎没有解决我的问题,因为我仍然会得到一些场景中最长的名字。

解决方案?

答案

我知道您希望通过选择具有最短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

以上是关于如何在分组时通过最短字符串获取MySQL搜索结果?的主要内容,如果未能解决你的问题,请参考以下文章

mysql - 为每组分组的 SQL 结果获取具有最大值的记录[重复]

uva 周期串(求模分组)

通过获取所有表结果对每行进行分组

mysql之聚合函数

MySQL 数据库在计数或求和和分组时失败 - 不是其他线程的重复

如何通过分组两列来防止重复? MYSQL/Codeigniter