4

我有 3 张桌子:videos,,,categoriesvideo_categories

videos中,我有 id、title 和其他字段。在categories中,我有 id 和 name。在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 来获得唯一的结果,但是我现在如何获得类别的名称?

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

id title    categories
1  Video1   pop, rock, jazz
4

2 回答 2

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

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

于 2013-06-03T17:27:45.173 回答
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
于 2013-06-03T17:28:28.873 回答