表连接 - 一行(/单元)的多行

时间:2011-05-30 18:52:18

标签: mysql join rows

我已经搜索了这个问题的解决方案,但还没有找到它(可能),可能是因为我不太清楚自己如何正确解释它。如果它已经发布到某个地方,请告诉我。

我所拥有的是三个彼此相关的数据库;主,件和组。基本上,主数据库包含来自帖子的最基本/最常用的信息,而片段数据库包含与该帖子相关联的数据。组数据库包含组的所有(长)名称,主数据库中的帖子可以“发布”。帖子可以同时发布在多个组中。当一个新帖子被添加到我的网站时,我也检查这些文章是否有重复项(检查帖子是否已经发布)。为了使重复项的搜索更有效,我只检查在同一组中发布的片段。

希望你还和我在一起,因为我觉得它开始让我感到困惑(让我知道我是否需要更清楚地指明事情):现在,main和pieces数据库都包含全名组(基本上我根本不使用组数据库)。我想要做的是用groups数据库中的相关ID替换这些组的名称。例如,我想改变这个:


MAIN_TABLE:

ID | group_posted_in
-------- | ---------------------------
1 | group_1,group_5
2 | group_15,group_75
3 | group_1,group_215


GROUPS_table:

ID | GROUP_NAME
-------- | ---------------------------
1 |
GROUP_1 2 | group_2
3 | group_3
等等...



MAIN_TABLE:

ID | group_posted_in
-------- | ---------------------------
1 | 1,5
2 | 15,75
3 | 1,215


或类似的东西。但是,此格式特别导致问题,因为以下查询将返回所有行(来自示例),而不仅仅是我需要的行:

SELECT * FROM main_table WHERE group = '5'

我要么必须将查询更改为以下内容:

...WHERE group = '5' OR group = '5,%' OR group = '%,5,%' OR group = '%,5'

或者我必须将数据库结构从逗号分隔值更改为如下所示:[15] [75]。随附的查询会更简单,但对我来说它似乎是一个麻烦的解决方案。此外,(简单)连接将不容易/可能。它总是要求我运行一个单独的查询来获取组的名称 - 用户是否搜索特定组中的帖子(在这种情况下,我首先必须运行查询来获取ID,然后搜索关联的帖子),或者是否显示它们(首先是帖子,然后是另一个查询以匹配组)。

所以,总之:我想我知道这个问题有一个解决方案,但我的直觉告诉我,这不是正确/最好的方法。所以,我认为将这篇文章联系在一起的问题是:

将组数据库连接到其他人的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

对于多对多关系,您需要创建一个连接表。您应该将该列拆分为单独表中的多个行,而不是将列表存储在单个列中。这将允许您对它们执行基于集合的功能,并将显着加快数据库的速度,并使其更加健壮和防错。

Main
MainID ...

Group
GroupID GroupName

GroupsInMain
GroupsInMainID MainID(FK) GroupID(FK)

因此,对于MainID 1,您将拥有GroupsInMain记录:

1,1,1
2,1,5

这将第1组和第5组与MainID 1

相关联

在这种情况下,FK表示外键(即对另一个表中的主键的引用)。您可能还想在MainID和GroupID上为GroupsInMain添加唯一约束,因为您永远不希望配对的相同值显示多次。

您的查询将是:

select GroupsInMain.MainID, Group.GroupName
    from Group, GroupsInMain
    where Group.GroupID=GroupsInMain.GroupID
        and Group.GroupID=5