mysql - 分组时如何按最短字符串获取 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
推荐阅读
- java - 如何在 Intellij IDEA 中更改变量名称颜色?
- python - Flask App 未启动(TypeError:code() 至少需要 14 个参数(给定 13 个))
- python - Groupby 客户和商店 - 获取平均交易频率。日期问题
- python - 如何生成块对角数据矩阵
- javascript - 使用硒获取 li 数据的快速方法?
- python - python字典列表,在括号内获取项目
- javascript - 如何在从 .net 后端到 js 前端的 2 个大嵌套 json 之间进行 JSON 差异/补丁?
- database - 语句超时:仅在 Web 会话上
- xcode - 为什么资源目录在我的项目导航器上不可见
- python - 无法将自定义模块导入 Airflow Docker 中的 dag 脚本