java - 分组时如何根据一个字段中最长的 'string'从mysql数据库中选择记录?

标签 java mysql sql string select

这是我的 table :

ID    Title    Content    Cluster
1       a       abc         1
2       b       abcde       1
3       c       abcde       1
4       d       abc         2
5       e       abcdef      2

我想根据字段内容中最长的“字符串”并按簇分组来选择记录。我该怎么做。

期望的结果:

ID    Title    Content    Cluster
3       c       abcde       1
5       e       abcdef      2

怎么做?

最佳答案

使用self join,你可以找出每个簇中所有长度最大的行:

select a.*
from my_table a
left join my_table b
on a.cluster = b.cluster
and length(a.content) < length(b.content)
where b.cluster is null;

SQL Fiddle Demo

另一种方法是在子查询中使用 group by:

select a.*
from my_table a
inner join (
    select cluster, max(length(content)) len
    from my_table
    group by cluster
) b on a.cluster = b.cluster and length(a.content) = b.len;

此外,如果内容包含 Unicode 字符,则使用 char_length 而不是 length 函数。

SQL Fiddle Demo

编辑:

为了清除长度上的关系,您可以获得具有最高 ID 的行(或根据您的需要最低):

select a.*
from cluster_sosial a
left join cluster_sosial b
on a.cluster = b.cluster
and (
    length(a.content) < length(b.content)
    or (length(a.content) = length(b.content) and a.cluster_sosial_id < b.cluster_sosial_id)
)
where b.cluster is null;

Demo

使用相关子查询

SELECT 
    *
FROM
    cluster_sosial a
WHERE
    cluster_sosial_id = (SELECT 
            cluster_sosial_id
        FROM
            cluster_sosial B
        WHERE
            a.Cluster = b.Cluster
        ORDER BY LENGTH(content) DESC , cluster_sosial_id DESC
        LIMIT 1)

Demo

关于java - 分组时如何根据一个字段中最长的 'string'从mysql数据库中选择记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41972656/

相关文章:

mysql - SQL - 检查唯一列对的条件

java - 比较两个excel文件中的数据并在第三个文件中写入相应的映射

java - 通过 Intellij IDEA 运行 Hadoop MR 作业

Java 对象值数组

python - 异常值 : 'DatabaseWrapper' object has no attribute 'Database'

mysql - 将具有重复行的表连接为属性

java Pair 和 ArrayList 问题

MySQL 字段值,可以定义超出数字计数的 float 吗?

java - 如何编写 MySql 选择查询,其中 id 不在列表中,可以为空

sql - Postgres 查询花费的时间比预期的要长,甚至在字段上有索引