【问题标题】:MySQL if row is duplicated prefer which matches field valueMySQL 如果行重复,则首选匹配字段值的行
【发布时间】:2020-12-28 12:02:45
【问题描述】:

我有以下选择查询。当存在“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,s.groupby,s.packageid,s.name,s.area,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

【问题讨论】:

    标签: mysql sql arrays select group-by


    【解决方案1】:

    我会分两步完成,计算你有多少重复行。通过重复,我的意思是在一列上相同,但在 ES 与 EN 上有所不同。对表格进行排序

    选择重复项中的最后一个

    Get top first record from duplicate records having no unique identity

    【讨论】:

    • 您是否有机会尝试将您的想法应用于我的查询?因为我不知道该怎么做
    【解决方案2】:

    外部联接表两次,每次联接查找单个特定值,然后按您喜欢的顺序合并字段:

    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 或更高版本,则应考虑该选项。

    【讨论】:

    • 我已经尝试过,但我不知道如何将您的解决方案应用于我的查询:( 我也可以运行 mysql 8
    【解决方案3】:

    您可以将窗口函数用作:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 2011-02-05
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多