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

问题描述 投票:0回答:1

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

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

希望你还和我在一起,因为我觉得它开始让我感到困惑的地方(让我知道我是否需要更明确地指明事情):现在,main和pieces数据库都包含该组的全名(s)(基本上我根本不使用群组数据库)。我想要做的是用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 |团队名字 -------- | --------------------------- 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,然后搜索关联的帖子),或者是否显示它们(首先是帖子,然后是另一个查询以匹配组)。

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

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

mysql join rows
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.