简单的SQL连接问题

时间:2011-08-20 21:48:29

标签: mysql sql join

这涉及一个应该显示所有即将发生的事件的网页,并标记当前用户日记中的任何事件。

日记表
diary_id
member_id
EVENT_ID

活动表
EVENT_ID
REGION_ID
...

区域表
REGION_ID
...

会员表
member_id
...

QUERY:

SELECT event.*, region.name, diary.diary_id 
FROM event, region 
LEFT JOIN diary on diary.member_id = 10 AND diary.event_id = event.event_id
WHERE region.region_id = event.region_id AND `date` >= NOW()

这是返回未知列event.event_id,我无法弄清楚原因。我不是SQL专家,但是预计这会起作用,并在diary_id列中为我所有不在用户日记中的事件给我一个NULL

3 个答案:

答案 0 :(得分:3)

您正在混合使用join语法。试试这个。

SELECT event.*,
       region.name,
       diary.diary_id
FROM   event
       INNER JOIN region
         ON region.region_id = event.region_id
       LEFT JOIN diary
         ON diary.member_id = 10
            AND diary.event_id = event.event_id
WHERE  `date` >= NOW()  

<强>更新

找不到event_id的问题是因为FROM event, region。它在event_id子句中找不到on。如上所述更改您的查询,但也可以通过将表格的位置切换为FROM region, event来修复它。不要那样做。使用大约20年前引入SQL语言的新连接语法。

答案 1 :(得分:0)

首先,我不会将diary.member_id = 10放入加入:

SELECT event.*, region.name, diary.diary_id 
FROM `event`, region 
LEFT JOIN diary ON diary.event_id = event.event_id
WHERE region.region_id = event.region_id AND `date` >= NOW() AND diary.member_id = 10

您确定event.event_id不是event.id吗?

答案 2 :(得分:0)

如果要进行左连接,请不要在where子句中放置diary.member_id = 10。在PL / SQL中,这会将您的左连接变为连接,而不会询问您

以下应该做得更好:

SELECT event.*, region.name, diary.diary_id 
FROM event
JOIN region on region.region_id = event.region_id  
LEFT JOIN ( select diary_id, event_id
              from diary 
             where diary.member_id = 10 ) diary
       ON diary.event_id = event.event_id
WHERE `date` >= NOW()