问题描述
我有以下选择查询。我想避免出现“ ES”行时出现重复的“ EN”行。喜欢喜欢ES而不是EN。
SELECT s.soft_id,s.groupby,s.packageid,s.name,s.area,l.min,GROUP_CONCAT(DISTINCT JSON_ARRAY(s.version,s.detailid,s.filesize,s.updatetime)) versions
FROM software s
INNER JOIN langs l ON s.lang_id=l.lang_id
INNER JOIN devices_type t ON (s.familylock_id=t.familylock_id OR (s.familylock_id=0 AND s.devicelock_id=t.device_type_id))
INNER JOIN devices d ON t.device_type_id=d.device_type_id
INNER JOIN users u ON d.user_id=u.user_id
WHERE s.groupby IN(1,2,3)
AND u.token="abc"
AND d.serialno="123456789"
AND l.min IN("ES","EN")
GROUP BY s.soft_id,l.min ORDER BY s.name ASC
这是示例结果:
解决方法
我分两个步骤进行操作,计算您有多少重复的行。重复来说,我的意思是一列相同,但ES与EN有所不同。对表进行排序
选择重复项中的最后一个
Get top first record from duplicate records having no unique identity
,外部连接表两次,每次连接查找单个特定值,然后按您喜欢的顺序合并字段:
SELECT s.soft_id,coalesce(les.min,len.min) As min,...
FROM software s
LEFT JOIN langs les ON s.lang_id=les.lang_id AND les.min = 'ES'
LEFT JOIN langs len ON s.lang_id=len.lang_id AND len.min = 'EN'
...
WHERE s.groupby IN(1,2,3)
AND coalesce(les.lang_id,len.lang_id) IS NOT NULL
...
窗口函数可以更有效地执行此操作,但是它们仍然仍然在许多MySql服务器上不受支持。如果您使用的是8.0或更高版本,则应查看该选项。
,您可以将窗口功能用作:
with q as (
<your query here>
)
select q.*
from (select q.*,row_number() over (partition by soft_id order by field(l.min,'ES','EN')) as seqnum
from q
) q
where seqnum = 1;