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相同的多条数据中,查询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条数据。
通过以上优化,可以更有效地查询出满足条件的数据。
原文地址: https://www.cveoy.top/t/topic/qnMM 著作权归作者所有。请勿转载和采集!