2011-09-19 184 views
-1

我有2表作爲event_master,事件INNER JOIN沒有返回有效記錄

  1. event_master
id subject location 
1 Test Test 
  1. 事件
event_id event_master_id from_user_id to_user_id status 
1    1   100   100  1 
2    1   100   101  1 

我寫了下面的代碼獲取記錄,

"SELECT * FROM event_master as em 
      INNER JOIN event as e 
      ON em.Id = e.event_master_id 
      WHERE em.Id = e.event_master_id AND (e.from_user_id = '100' OR e.to_user_id = 100) and e.status = 1" 

它給了我2條記錄,我需要的是隻有1分的記錄,這將是其中from_user_id和to_user_id是一樣的,如果不然後尋找to_user_id

回答

1

如果你想記錄在哪裏以及是相同的,否則對於用戶的記錄,爲什麼不直接篩選的用戶:

SELECT * 
FROM 
    event_master as em 
    INNER JOIN event as e ON em.Id = e.event_master_id 
WHERE 
    em.Id = e.event_master_id AND 
    e.to_user_id = 100 and 
    e.status = 1 
0

首先,WHERE子句中的em.Id = e.event_master_id是多餘的,您已經在ON子句中檢查了它!

除此之外,這裏發生了什麼。

你說

event_master AS em INNER JOIN event AS e 
ON em.id = e.event_master_id 

這給你如下表:

em.id em.subject em.location e.event_id e.event_master_id e.from_user_id e.to_user_id e.status 
1  Test  Test  1   1     100   100   1 
1  Test  Test  1   1     100   101   1 

因爲對event兩條線event_master相匹配的行。

這樣,你就從這個表上的這個條件選擇:

em.Id = e.event_master_id 
AND 
    (e.from_user_id = '100' 
    OR 
    e.to_user_id = 100) 
AND 
e.status = 1 

好了,AND的第一部分是對兩行真實的,因爲那是你的INNER JOIN條件。第三部分對於兩行也是如此,因爲e.status是1.第二部分,即OR部分,表示e.from_user_is = 100 OR blablabla。由於e.from_user_is = 100對於兩行都是正確的,因此AND謂詞的這一部分也是真實的。

因此,您將得到AND謂詞的所有三個部分對於兩行都爲真。因此,SELECT會向您返回兩行。

現在你想要的東西不是很清楚。如果你想from_user_id等於to_user_id,你應該把... AND e.from_user_id = e.from_user_id放在你的WHERE謂詞中。

到你說的部分如果沒有,然後尋找to_user_id我沒有真正得到。