使用子查询和 GROUP BY 语句过滤重复数据,获取最新记录

在 MySQL 查询中,可以使用子查询和 GROUP BY 语句来过滤掉重复的记录,只保留每组数据的最新一条记录。例如,要获取 iw_seaservice_apply 表中每个 talent_user_idcompany_id 组合的最新一条记录,可以使用以下 SQL 语句:

SELECT * FROM (
    SELECT a.id,b.id AS seaservice_id,a.create_time,b.talent_user_id,b.company_id,b.title,b.pay_amount,b.payment_way,b.currency,b.completion_time,b.sea_service_status,b.service_address,
    COALESCE(c.short_name_cn,e.realname, e.nickname, e.username) AS companyName,a.status AS applyStatus,IFNULL(d.has_withdraw,0) as hasWithdraw
    FROM iw_seaservice_apply a 
    LEFT JOIN iw_seaservice b ON a.seaservice_id = b.id 
    LEFT JOIN iw_company c ON a.company_id = c.id
    LEFT JOIN iw_seaservice_completion_apply d ON a.id = d.seaservice_apply_id 
    LEFT JOIN iw_talent_user e ON a.talent_user_id = e.id
) T 
WHERE (T.talent_user_id, T.company_id, T.create_time) IN (
    SELECT talent_user_id, company_id, MAX(create_time)
    FROM iw_seaservice_apply
    GROUP BY talent_user_id, company_id
)
${ew.customSqlSegment}
<if test="minPayAmount != null">
    AND pay_amount >= #{minPayAmount}
</if>
<if test="maxPayAmount != null">
    AND pay_amount <= #{maxPayAmount}
</if>
<if test="applyStatus != null">
    AND applyStatus = #{applyStatus}
</if>
<if test="companyName != null and companyName != '' ">
    AND companyName LIKE '${companyName}%'
</if>
ORDER BY create_time DESC

解释:

  1. 子查询SELECT talent_user_id, company_id, MAX(create_time) FROM iw_seaservice_apply GROUP BY talent_user_id, company_id 用于获取每个 talent_user_idcompany_id 组合的最新 create_time
  2. WHERE 子句WHERE (T.talent_user_id, T.company_id, T.create_time) IN (...) 用于筛选出子查询结果中的记录。
  3. GROUP BY:子查询中的 GROUP BY talent_user_id, company_id 用于将数据按照 talent_user_idcompany_id 分组。
  4. MAX(create_time):子查询中的 MAX(create_time) 用于获取每个分组中最大的 create_time

注意:

  • ew.customSqlSegment 是一个占位符,用于表示自定义的 SQL 片段,你可以根据需要进行替换。
  • 代码中使用 '${companyName}%' 来进行模糊匹配,可以使用其他方式根据需要进行修改。

这个查询语句会先将 iw_seaservice_apply 表中的所有数据按照 talent_user_idcompany_id 分组,然后使用 MAX(create_time) 获取每个分组中最大的 create_time,最后使用 WHERE 子句筛选出包含这些最大 create_time 的记录。这样就可以保证每个 talent_user_idcompany_id 组合只保留最新的一条记录。

希望这个解释能够帮助你理解如何使用子查询和 GROUP BY 语句来过滤重复数据,获取最新的一条记录。

MySQL 查询过滤重复数据 - 获取最新一条记录

原文地址: https://www.cveoy.top/t/topic/oi2E 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录