【问题标题】:Relations between 3 mysql tables3个mysql表之间的关系
【发布时间】:2009-10-08 23:03:33
【问题描述】:

我有 3 个 mysql 表:事件、艺术家和(艺术家)描述。它们都是多对多的关系。

表“事件”:

 ID | eventTitle | etc.
-----------------------
  1 | event 1    |
  2 | event 2    |
etc.

表“艺术家”:

 ID | artistName | etc.
-----------------------
  1 | artist 1   |
  2 | artist 2   |
etc.

表“描述”:

 ID | artistDesc             | etc.
----------------------------------
  1 | artist 1 description 1 |
  2 | artist 1 description 2 |
  3 | artist 2 description 1 |
  4 | artist 2 description 2 |
  5 | artist 3 description 1 |
etc.

我还制作了联结表events_artistsartists_desctriptions。它们都只有 2 个外键,仅用于链接事件、艺术家和描述 ID。

在我的描述表中注意 - 每个艺术家可以有许多描述。这实际上意味着每个描述只属于一个特定事件。 =)

如果我这样查询:

$q = "SELECT 
        events.*,artists.*,descriptions.*,events_artists.*,artists_descriptions.* 
        FROM 
        events,artists,descriptions,events_artists,artists_descriptions 
        WHERE 
        events.eventID = events_artists.eventID AND 
        events_artists.artistID = artists.artistID AND 
        artists.artistID = artists_descriptions.artistID AND 
        artists_descriptions.descID = descriptions.descID"; 

我将获得特定艺术家的所有描述。但是没有一个描述会知道它们属于哪个事件...... 我想向用户显示的是这样的:

活动 1
艺术家 1(艺术家 1 描述 1)
艺术家 2(艺术家 2 描述 2)

活动 2
艺术家 3(艺术家 3 描述 6)
艺术家 1(艺术家 1 描述 3)

等等

我应该为事件描述关系制作一个联结表吗?如果我这样做,我不知道如何使用它,哎呀! =) 或者也许我的问题无法通过简单的查询来解决?我也应该用 php 做点什么吗?对不起,我完全糊涂了=)

我希望我能正确解释我的问题...

提前感谢您的帮助!

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    您应该将 events_artistsdescriptions 表组合在一起,以便只有 1 个表将艺术家链接到事件和描述。

    【讨论】:

    • 你的意思是像改变我的 events_artists 表 - 添加一个引用 descriptionID 的键?
    • 我的意思是通过添加description 列来更改events_artists 表,因为描述与事件和艺术家相关联。这样,您将只有 3 个表,不再需要 descriptionsartists_desctriptions 表。
    • @najmeddine:你的意思是我应该把我的descriptioncolumn 放到 events_artists 表中,而不是作为 ID 参考,而是作为 TEXT 列(它现在是我的 descriptionstable 中的 TEXT 列。 .
    • 是的,只要描述和事件始终是 1-1 关系,它们应该在同一个表中。这将解决您的问题。
    • 好的,这听起来很有趣 =) 我明天一定会试一试,因为这里是凌晨 2 点...感谢您的帮助,我会报告结果 =)
    【解决方案2】:

    您可以修改已有的表吗?如果是这样,并且每个艺术家描述只能有一个艺术家和一个事件,那么我会将您的架构修改为:
    表事件原样。
    餐桌艺术家原样。
    表说明:

    ID | artistDesc                     | artistId | eventId | etc.
    ------------------------------------------------------------------
     1 | description of artist at event | 4        | 1       | ...
    

    然后您可以选择事件的所有描述:

    $query = "SELECT 
        events.*,artists.*,descriptions.*
        FROM 
        events,artists,descriptions
        WHERE 
        artists.artistID = descriptions.artistID AND 
        events.eventID = descriptions.eventID AND
        events.eventID = $eventIdYouWant";
    

    您可以将该查询的最后一行更改为events.event_name = $eventNameYouWantartists.artist_name = $artistNameYouWant,它的工作方式与您直接指定ID 相同。

    【讨论】:

    • 好的,我理解这个想法......但在我的查询中,我通常指的是艺术家姓名或活动名称,而不是 ID......我认为很难改变它,因为整个概念网站是基于此...所以你认为它可以在我的情况下工作吗?
    【解决方案3】:

    您已经说过它是 3 个表之间的关系 .. 所以我认为答案很明显 .. 您需要在一个表中有 1 个表 artist_id 、 event_id 和 description_id ,而不是像您现在那样将其分为两个表.

    【讨论】:

      【解决方案4】:

      如果可以的话,我认为你应该改变你的表结构。 它将导致更整洁的设计。 制作一个表,artist_event_description,其中包含所有 ID 作为外键,而不是两个联结表,它将帮助您找出描述属于哪个事件和艺术家。

      您可以做的另一件事是在 Description 表中再添加两列 eventId 和 ArtistId(这些将是外键)并删除联结表。这样,您只需对描述表执行 SELECT 即可直接获取所需的所有信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 2015-08-02
        • 2018-03-08
        • 2016-09-03
        相关资源
        最近更新 更多