如何在分组时通过最短字符串获取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 结果获取具有最大值的记录[重复]