2011-09-19 115 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我没有真正得到。