Внутреннее объединение не возвращает действительные записи - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть 2 таблицы как event_master, события как

  1. event_master
id subject location
1  Test    Test
  1. events
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 ]

1 голос
/ 19 сентября 2011

Если вы хотите, чтобы запись о том, откуда и откуда совпадали, или же запись для пользователя, почему бы просто не выполнить фильтрацию для пользователя:

0 голосов
/ 20 сентября 2011

Прежде всего, 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 Я действительно не понял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...