这是我的 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/