内部联接不返回有效记录

时间:2011-09-19 11:52:46

标签: mysql join

我有2个表作为event_master,事件作为

  1. event_master
  2. id subject location
    1  Test    Test
    
    1. 事件
    2. 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

2 个答案:

答案 0 :(得分:1)

如果您希望记录的往返地址相同,或者是to用户的记录,为什么不只是过滤给用户:

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

答案 1 :(得分:0)

首先,em.Id = e.event_master_id子句中的WHERE是多余的,您已经在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_master的一行匹配event的两行。

然后你在这个条件下从这个表中选择:

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谓词中。

要分享你说的地方,如果没有,那么找{i}} 我真的没有。