2010-01-03 53 views
0

一個SQL問題,我不知道爲什麼這些說法是不一樣的(第一個爲我工作)有關鏈接表

AND user_thread_map.user_id = $user_id 
AND user_thread_map.thread_id = threads.id 

AND user_thread_map.user_id = users.id 
AND user_thread_map.thread_id = threads.id 
AND users.id = $user_id 

難道他們不應該是一樣的嗎?在第二個鏈接中,我鏈接了前兩行中的所有表,然後告訴它選擇users.id = $ user_id。

有人可以解釋爲什麼第二個聲明不起作用?因爲我認爲會。

+5

您應該發佈整個查詢和表結構。 – 2010-01-03 11:49:04

回答

1

假設你沒有得到返回的行(你真的不說的問題是什麼,所以我在這裏猜測了一下),我首先想到的是,有在users沒有行,其中id是等於$user_id

這是這兩個SQL段的基本區別,第二個是user_thread_map,threadsusers表的交叉連接。第一個根本不加入users,所以這就是我要找的問題。

看起來您的user_thread_map表格是usersthreads之間的多對多關係。如果這是真的,你確定你有該表中的ID字段之間既相對其他表的外鍵約束,是這樣的:

users: 
    id integer primary key 
    name varchar(50) 
threads: 
    id integer primary key 
    thread_text varchar(100) 
user_thread_map: 
    user_id integer references users(id) 
    thread_id integer references threads(id) 

如果你有這些外鍵約束,應該是不可能的最後得到一個user_thread_map(user_id)的值,該值沒有相應的users(id)值。

如果這些限制是不存在,查詢可以告訴你哪些值需要之前立即加入約束是固定的(這點很重要,以防止問題再次發生),是這樣的:

select user_thread_map.user_id 
from user_thread_map 
left join users 
on user_thread_map.user_id = users.id 
where users.id is null 
+0

其真奇怪的原因檢查外鍵是否應用於user_thread_map表。不知道爲什麼它沒有工作。但我只是選擇了第一個。 – ajsie 2010-01-03 13:33:44

1

第一個會從表user_thread_mapuser_id = $user_id中選擇記錄,而不管表user中的記錄是否與該ID存在一致。如果找到user中的相關記錄,第二個查詢將只返回一些內容。