关于优化连接查询的建议

时间:2013-06-03 17:25:32

标签: php mysql codeigniter

我有3个表:videoscategoriesvideo_categories

videos中,我有id,title和其他字段。 在categories,我有id和名字。 在video_categories中,我有id,video_id和category_id。

一个视频可以有多个类别。所以video_categories表就是这样的。

id   video_id  category_id
1    1         1
2    1         2
3    1         3

如果我想要一个视频列表并显示其类别,哪个更受欢迎?

  1. 通过PHP,调用1个查询来获取所有视频,然后循环查询以获取每个视频的类别,并通过另一个查询获取类别名称。如果桌子很大,这会非常慢,对吗?

  2. 通过MySQL加入(需要帮助)。如果我将视频连接到video_categories,则会有3个相同video_id的结果。我可以使用GROUP BY或SELECT DISTINCT来获得独特的结果,但我现在如何获得类别的名称?

  3. 我的预期结果将是这样的:

    id title    categories
    1  Video1   pop, rock, jazz
    

2 个答案:

答案 0 :(得分:3)

对于选项2,请使用GROUP_CONCAT。没关系

SELECT v.id, v.title, GROUP_CONCAT(c.name)
FROM videos v
INNER JOIN video_categories vc ON vc.video_id = v.id
INNER JOIN categories c ON vc.category_id = c.id
GROUP BY v.id, v.title

对于Group_Concat()函数,是默认分隔符。这就是为什么我不在这里使用它。

答案 1 :(得分:3)

猜猜其他列的名称..

SELECT v.video_id, v.title, GROUP_CONCAT(c.category_name SEPARATOR ', ')
FROM videos v
LEFT JOIN video_categories vc ON vc.video_id = v.video_id
LEFT JOIN categories c ON c.category_id = vc.category_id
GROUP BY v.video_id, v.title