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相同的多条数据(大于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
) AND EXISTS (
    SELECT *
    FROM mac_vod mv2
    WHERE mv2.vod_name = mac_vod.vod_name
    AND ABS(mv2.vod_year - mac_vod.vod_year) <= 1
    AND mv2.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

解释:

修改后的SQL语句在原有的基础上添加了一个子查询,用于判断相同vod_name的数据中,是否存在vod_year相差不大于1的数据。使用EXISTS关键字来进行判断,同时增加了一个条件来限制type_id的范围。

子查询的作用:

  • 使用 EXISTS 关键字判断是否存在符合条件的记录,提高效率。
  • 使用 ABS(mv2.vod_year - mac_vod.vod_year) <= 1 来判断vod_year相差是否不大于1。
  • 限制 mv2.type_id 的范围,确保查询结果符合要求。

通过以上修改,可以更准确地查询到vod_name相同且vod_year相差不大于1的数据。


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

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