Mysql 内部联接未返回有效记录

Mysql 内部联接未返回有效记录,mysql,join,Mysql,Join,我有两个表作为事件主控,事件作为 事件管理器 事件 我编写以下代码来获取记录 "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.sta

我有两个表作为事件主控,事件作为

  • 事件管理器
  • 事件
  • 我编写以下代码来获取记录

    "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

    如果您希望to和from的记录相同,或者to用户的记录相同,为什么不只筛选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
    

    首先,如果
    子句中的
    em.Id=e.event\u master\u 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
    
    因为
    事件的一行与
    事件的两行匹配

    然后,您将在此条件下从该表中选择:

    em.Id = e.event_master_id
    AND
        (e.from_user_id = '100'
        OR
        e.to_user_id = 100)
    AND 
    e.status = 1
    
    嗯,
    的第一部分对于这两行都是正确的,因为这是
    内部联接的条件。第三部分同样适用于两行,因为
    e.status
    为1。第二部分是
    部分,表示
    e.from_user_is=100或blablabla
    。由于
    e.from\u user\u is=100
    对两行都为真,因此
    谓词的这一部分也为真

    因此,两行的
    谓词的所有三个部分都为true。因此,
    SELECT
    会将这两行返回给您

    现在我还不清楚你想要什么。如果您希望从用户id
    到用户id
    等于
    ,则应将
    。。。e.from_user_id=e.from_user_id
    WHERE
    谓词中

    说出你说的部分,如果没有,那么寻找
    To_user\u 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
    
    em.Id = e.event_master_id
    AND
        (e.from_user_id = '100'
        OR
        e.to_user_id = 100)
    AND 
    e.status = 1