Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分组时如何按最短字符串获取MySQL搜索结果?_Mysql_Sql - Fatal编程技术网

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

分组时如何按最短字符串获取MySQL搜索结果?,mysql,sql,Mysql,Sql,我有一个正在运行的查询: SELECT a.* FROM a GROUP BY a.prefixNumber ORDER BY LENGTH(a.uniqueName) ASC, a.prefixNumber; 两行或多行数据可能包含ABC-123形式的相同前缀号,但它们的每个前缀号都有一个唯一的名称。我想要长度最短的uniqueName,同时仍然能够按前缀编号分组 我猜当我使用GROUPBY子句时会发生一些事情,但我不确定,因为我的SQL技能不是最高的。我一直在四处寻找,找到了Length

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

SELECT a.* 
FROM a
GROUP BY a.prefixNumber
ORDER BY LENGTH(a.uniqueName) ASC, a.prefixNumber;
两行或多行数据可能包含ABC-123形式的相同前缀号,但它们的每个前缀号都有一个唯一的名称。我想要长度最短的uniqueName,同时仍然能够按前缀编号分组

我猜当我使用GROUPBY子句时会发生一些事情,但我不确定,因为我的SQL技能不是最高的。我一直在四处寻找,找到了Lengtha.uniqueName解决方案。这似乎并没有解决我的问题,因为在一些场景中,我仍然会得到最长的名称


灵魂

我知道您希望通过选择具有最短uniqueName的记录来删除prefixNumber上的重复项

我将使用“不存在”而不是聚合:

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

您的查询无效,因为您的列不在GROUP BY中,也不属于聚合函数的参数。MySQL的旧版本或配置松散的版本可能会接受这样的错误查询,但结果可能令人惊讶。它缺少一个FROM子句。要用一个错误的查询来传达您想要的信息,这并不能满足您的需求,这是毫无用处的。请编辑您的问题,并添加相关表的CREATE语句、作为这些表的INSERT语句的样本数据以及使用给定样本数据生成的所需结果。您能否更详细地了解NOT EXISTS子句的作用?请,谢谢!编辑后的另一个问题是,如果有两行以上的行具有相同的前缀号,这是否重要?@MarkHill:不,这不重要。在这种情况下,将只选择具有最短uniqueName的记录。
SELECT *
FROM (
    SELECT 
        a.*,
        ROW_NUMBER() OVER(PARTITION BY prefixNumber ORDER BY LENGTH(uniqueName)) rn
    FROM a
) x 
WHERE rn = 1