[英]How do I select record from mysql database based on the longest 'string' in one filed when grouping?
這是我的桌子:
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
怎么做?
使用自連接,您可以找出每個集群中具有最大長度的所有行:
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;
另一種方法是在子查詢中使用分組依據:
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
函數。
為了使長度保持一致,您可以獲取ID最高(或根據需要最低的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;
使用相關子查詢
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)
這是使用EXISTS
一種方法
SELECT *
FROM Yourtable a
WHERE EXISTS (SELECT 1
FROM Yourtable B
WHERE a.Cluster = b.Cluster
HAVING Max(Len(b.Content)) = Len(a.Content))
要么
SELECT *
FROM yourtable a
WHERE Content = (SELECT content
FROM yourtable B
WHERE a.Cluster = b.Cluster
ORDER BY Len(content) DESC Limit 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.