我试图获得具有多对多关系的独特结果表。我有带视频的表格,带有类别和数据透视表的表格。当我想只选择属于一个类别的视频时。我有大约50.000个视频和大约90个类别。当我尝试下一个查询时,我会收到视频的重复(每个类别一个),我只希望显示唯一的视频。
SELECT video_id, add_date FROM videos
INNER JOIN video_category ON videos.id = video_category.video_id
WHERE video_id IN (2, 1, 3, ... , 60)
ORDER BY add_date DESC, video_id DESC
当我尝试通过video_id进行分组时:
SELECT video_id, add_date FROM videos
INNER JOIN video_category ON videos.id = video_category.video_id
WHERE video_id IN (2, 1, 3, ... , 60)
GROUP BY video_id
ORDER BY add_date DESC, video_id DESC
此查询花了大约5-7秒,这太长了。
有什么建议我可以改写吗?
编辑: 添加了表别名
答案 0 :(得分:1)
我假设这是您的查询:
SELECT s.video_id, s.add_date
FROM ac_scene s INNER JOIN
ac_scene_category sc
ON s.id = sc.ac_scene_id
WHERE sc.ac_category_id IN (2, 1, 3, ... , 60)
GROUP BY s.video_id
ORDER BY s.add_date DESC, s.video_id DESC;
如果是这样,请考虑重写查询并添加适当的索引:
select s.video_id, s.add_date
from ac_scene s
where exists (select 1
from ac_scene_category sc
where s.id = sc.ac_scene_id and
sc.ac_category_id IN (2, 1, 3, ... , 60)
)
order by s.add_date DESC, s.video_id DESC;
为获得最佳效果,请在ac_scene_category(ac_scene_id, ac_category_id)
和ac_scene(s.add_date, s.video_id)
上创建索引。
答案 1 :(得分:0)
嗯,你不能再真正简化你的查询了。如果5-7秒太长,那么性能问题将出现在您的数据库而不是您的查询中。
但请尝试使用DISTINCT
SELECT DISTINCT video_id, add_date FROM ac_scene
INNER JOIN ac_scene_category ON ac_scene.id = ac_scene_category.ac_scene_id
WHERE ac_category_id IN (2, 1, 3, ... , 60)
ORDER BY add_date, video_id DESC