MySQL如果行重复则首选匹配字段值的MySQL

问题描述

我有以下选择查询。我想避免出现“ 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

这是示例结果:

image

您可以在此处测试查询:http://185.27.134.10/login.php?2=epiz_26706010wejghelqwdtg3e54gVGtSRk1VMUVRVE5QVkdzeFRWaDNhRWxUUldoSldIZzRaa2g0T0daSWVEaG1TSGhvVjIxc1JGb3lkRk5rV0U1cFZsRTlQUT09wejghelqwdtg3e54gsql102.epizy.comwejghelqwdtg3e54gepiz_26706010_test&db=epiz_26706010_test

解决方法

我分两个步骤进行操作,计算您有多少重复的行。重复来说,我的意思是一列相同,但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;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...