Прежде всего, 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
имеет значение true для обеих строк, эта часть предиката AND
также имеет значение true.
Таким образом, вы получаете все три части предиката AND
true для обеих строк.В результате SELECT
возвращает вам обе строки.
Теперь то, что вы хотите, мне не совсем понятно.Если вы хотите, чтобы from_user_id
было равно to_user_id
, вы должны поставить ... AND e.from_user_id = e.from_user_id
в свой предикат WHERE
.
Чтобы расстаться там, где вы сказали , а если нет, то найдите to_user_id
Я действительно не понял.