SQL优化:查询vod_name相同且vod_year相差不大于1的数据
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 著作权归作者所有。请勿转载和采集!