SQL优化:查询相同vod_name但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

目标: 在mac_vod表中的所有vod_name相同的多条数据中,查询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
)
AND EXISTS (
    SELECT *
    FROM mac_vod AS mv
    WHERE mv.vod_name = mac_vod.vod_name
    AND ABS(mv.vod_year - mac_vod.vod_year) <= 1
    AND mv.type_id IN (1,6,7,8,9,10,11,12,20,21,22,23,24,25,26)
)
ORDER BY vod_name ASC, vod_time DESC
LIMIT 30

优化思路:

在原有的查询语句基础上,添加了一个子查询来检查相同vod_name的数据中,vod_year相差不大于1的数据。使用EXISTS子句来判断是否存在满足条件的数据,并在WHERE子句中添加了ABS函数来计算绝对值,以便比较vod_year的差值。

解释:

  • 子查询: 用于筛选出相同vod_name且vod_year相差不大于1的数据。
  • EXISTS子句: 检查子查询的结果是否为空,如果为空则表示没有满足条件的数据。
  • ABS函数: 用于计算vod_year的差值的绝对值,方便比较。

注意:

  • type_id的值需要根据实际情况进行修改。
  • LIMIT 30 表示只返回前30条数据。

通过以上优化,可以更有效地查询出满足条件的数据。

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

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

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