3个mysql表之间的关系

时间:2009-10-08 23:03:34

标签: php sql mysql

我有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"; 

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

EVENT 1
艺术家1(艺术家1描述1)
艺术家2(艺术家2描述2)

EVENT 2
艺术家3(艺术家3描述6)
艺术家1(艺术家1描述3)

我应该为事件描述关系建立联结表吗?如果我这样做,我不确切知道如何使用它,uff! =) 或者也许我的问题无法通过简单的查询解决?我也应该用PHP做点什么吗?对不起,我很困惑=)

我希望我能够妥善解释我的问题......

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

你应该合并events_artists& descriptions个表只有1个表,用于将艺术家与事件和描述相关联。

答案 1 :(得分: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的方式相同。

答案 2 :(得分:1)

你已经说过3个表之间的关系..所以我认为答案非常明显..你需要在ONE表中有1个表artist_id,event_id和description_id而不是像现在这样在两个表中潜水

答案 3 :(得分:1)

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

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