这涉及一个应该显示所有即将发生的事件的网页,并标记当前用户日记中的任何事件。
日记表
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
答案 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()