【发布时间】:2013-06-03 17:25:31
【问题描述】:
我有 3 张桌子:videos、categories、video_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
如果我想要一个视频列表并显示它们的类别,那会是首选?
通过 PHP,调用 1 个查询以获取所有视频,然后循环查询以获取每个视频的类别,并通过另一个查询获取类别名称。如果表很大,这会很慢,对吧?
通过 MySQL 连接(在这方面需要帮助)。如果我将加入视频留给 video_categories,将有 3 个相同 video_id 的结果。我可以使用 GROUP BY 或 SELECT DISTINCT 来获得唯一的结果,但我现在如何获得类别的名称?
我的预期结果是这样的:
id title categories
1 Video1 pop, rock, jazz
【问题讨论】:
-
我认为您的问题本身与非规范化无关。正如您所描述的,您的架构是完全标准化的,这意味着它没有冗余数据。您可以通过将
categories列添加到videos表来对其进行非规范化,您将在其中存储以逗号分隔的类别名称字符串(例如“流行音乐、摇滚乐、爵士乐”),然后使其与冗余的保持同步categories和video_categories表中的数据。就目前而言,您的问题实际上只是询问优化您的连接技术,正如其他人所指出的,这可以使用group_concat方法完成。 -
是的,我很困惑。我一定认为非规范化是规范化的逆过程,即读取和显示规范化的模式。我已经编辑了标题以避免混淆
标签: php mysql codeigniter