SQL 查询优化:筛选 vod_name 相同且 vod_year 相差不大于 1 的数据
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值可以控制查询结果的数量。
原文地址: https://www.cveoy.top/t/topic/qnME 著作权归作者所有。请勿转载和采集!