2011-08-20 85 views
2

這涉及到一個應顯示所有即將發生的事件的網頁,並標記當前用戶日記中的任何事件。簡單SQL連接的問題

日記表
diary_id
member_id
事項標識

事件表
事項標識
REGION_ID
...

區域TABL Ë
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高手,但預計這隻會工作,並給我一個NULL在diary_id列中的所有事件不在用戶的日記

+0

您可以編輯的帖子,包括實際的完整的錯誤消息,格式化爲代碼? –

+1

你的事件ID列是否被命名爲'event_id'?如果啓動MySQL客戶端並鍵入'describe event;',你會看到什麼? –

回答

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的。它在on條款中找不到event_id。按照上面的建議更改您的查詢,但也可以通過將表格的位置切換到FROM region, event來修復它。不要這樣做。大約20年前使用引入SQL語言的新連接語法。

+1

+1。基本上,當逗號分隔的表列表後面跟着一個JOIN子句時,只有緊接在該子句之前的表參與連接,而不是全部列表。換句話說,在這兩種運算符(逗號加入和JOIN子句)之間,後者優先於前者。 –

+0

謝謝。工作。我可能需要了解更多關於聯接的信息;-) – gio

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

+1

如果您將'diary.member_id = 10'移動到where子句,則不再對'diary'執行'left outer join'。結果將不一樣。 –

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()