在三个表上使用JOIN - MySQL

时间:2011-10-20 01:59:25

标签: php mysql

我的表格安排如下。为简单起见,我只在每个中显示一个值。

表:事件

Event_ID   Event_Title
1          Broad Street Gathering

表:EventUserTags

User_ID  Event_ID
10092    1

表:UserLinks

User_1  User_2
10092   29809

如果当前用户的ID为10092:

1)从 UserLinks 中选择ID,其中 User_1 User_2 为10092(如果User_1为10092,则选择User_2)

2)使用User_ID(上面获得)从 EventUserTags 中选择 Event_ID

3)使用Event_ID(上面获得)从事件中选择 Event_Title

所以,例如:

如果登录用户的ID为10092,则此查询将获取Event_Title“Broad Street Gathering”

到目前为止,我没有运气。任何帮助都表示赞赏

此网站的用户建议使用:

SELECT
   Event_Title,
   Event_ID,
   User_1,
   User_2
    FROM
   Events
   NATURAL JOIN EventUserTags
   JOIN UserLinks ON (
          User_ID = User_1 AND User_2 = $id
          OR User_ID = User_2 AND User_1 = $id
       )

3 个答案:

答案 0 :(得分:1)

这里的问题是,有时您使用User_1和有时User_2加入表格,这不是一个在连接条件下表达的简单概念。

相反,您可以将两个单独的SELECTUNION组合在一起以获得单个结果集。

 SELECT UL.User_1 AS User_ID, EUT.Event_ID, E.Event_Title
 FROM UserLinks UL 
      INNER JOIN EventUserTags EUT ON UL.User_1 = EUT.User_ID
      INNER JOIN Events E ON E.Event_ID = EUT_Event_ID
 WHERE UL.User_1 = :user_id
 UNION ALL
 SELECT UL.User_2 AS User_ID, EUT.Event_ID, E.Event_Title
 FROM UserLinks UL 
      INNER JOIN EventUserTags EUT ON UL.User_2 = EUT.User_ID
      INNER JOIN Events E ON E.Event_ID = EUT_Event_ID
 WHERE UL.User_2 = :user_id

答案 1 :(得分:0)

我真的不明白你的UserLinks表的设置。 你真的应该:

user_id  link
1        10092
2        29809

然后你可以很容易地使用:

SELECT e.* tags.*, user.*
FROM Events e
JOIN EventUserTags tags
ON tags.event_id=e.event_id
JOIN UserLinks user
ON user.user_id=tags.user_id
WHERE user.user_id=$id

答案 2 :(得分:0)

SELECT e.Event_Title, e.Event_ID, 
       COALESCE(ul1.User_1, ul2.User_1) AS User_1,
       COALESCE(ul1.User_2, ul2.User_2) AS User_2
    FROM EventUserTags eut
        INNER JOIN Events e
            ON eut.Event_ID = e.Event_ID
        LEFT JOIN UserLinks ul1
            ON eut.User_ID = ul1.User_1
        LEFT JOIN UserLinks ul2
            ON eut.User_ID = ul2.User_2
    WHERE eut.User_ID = $id
        AND (ul1.User_1 IS NOT NULL OR ul2.User_2 IS NOT NULL)