SQL 查询优化:筛选 vod_name 相同且 vod_year 相差不大于 1 的数据

以下 SQL 语句从 mac_vod 表中筛选出所有 vod_name 相同的多条数据(大于 1 条),并过滤出 vod_year 相差不大于 1 的数据。

原始 SQL 语句:

SELECT vod_id, type_id, vod_name, vod_year, vod_time
FROM mac_vod
WHERE (vod_name, vod_year) IN (
    SELECT vod_name, vod_year
    FROM mac_vod
    WHERE type_id IN (1,6,7,8,9,10,11,12,20,21,22,23,24,25,26)
    GROUP BY vod_name, vod_year
    HAVING COUNT(*) > 1
)
ORDER BY vod_name ASC, vod_time DESC
LIMIT 30

修改后的 SQL 语句:

SELECT vod_id, type_id, vod_name, vod_year, vod_time
FROM mac_vod
WHERE (vod_name, vod_year) IN (
    SELECT vod_name, vod_year
    FROM mac_vod
    WHERE type_id IN (1,6,7,8,9,10,11,12,20,21,22,23,24,25,26)
    GROUP BY vod_name, vod_year
    HAVING COUNT(*) > 1
)
AND EXISTS (
    SELECT 1
    FROM mac_vod mv
    WHERE mv.vod_name = mac_vod.vod_name
    AND ABS(mv.vod_year - mac_vod.vod_year) <= 1
)
ORDER BY vod_name ASC, vod_time DESC
LIMIT 30

优化说明:

在原有的 SQL 语句基础上,添加了一个子查询来检查符合条件的数据。子查询使用 EXISTS 关键字来判断 mac_vod 表中是否存在与外部查询中的 vod_name 相同,并且 vod_year 相差不大于 1 的数据。

注意:

  • ABS() 函数用于计算两个年份的绝对值差。
  • EXISTS 子查询可以提高查询效率,因为它只需要判断是否存在满足条件的数据,而不需要返回实际的数据。
  • 调整 LIMIT 值可以控制查询结果的数量。
SQL 查询优化:筛选 vod_name 相同且 vod_year 相差不大于 1 的数据

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

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