我有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_artists
和artists_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做点什么吗?对不起,我很困惑=)
我希望我能够妥善解释我的问题......
提前感谢您的帮助!
答案 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 = $eventNameYouWant
或artists.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即可直接获得所需的所有信息。