2011-12-25 3 views
0

У меня есть таблица place содержит author_id и таблица place_user_relation содержит столбцы user_id, place_id
Как применять или JOIN ... ON заявление

Я хочу принести `` place.id` где place_user_relation.user_id = 1` или `place.author_id = 1`. Проблема заключается в том, что этот критерий состоит из двух таблиц. Насколько я знаю, я написал неверный запрос:

 
    SELECT r.*,p.* FROM place_user_relation as r 
    JOIN place as p 
    ON p.place_id=r.place OR p.author_id=1 
    WHERE r.user_id=1 
    /*I also tried WHERE r.user_id=1 OR p.author_id=1*/ 
, в котором содержится инструкция OR в ON, похоже, я не могу этого сделать. Каков правильный способ сделать это?

+0

Какая ошибка вы получаете? – dasblinkenlight

+0

@dasblinkenlight этот запрос соединения возвращает пустой набор. При выборе * from relation_place_user, где user_id = 1 пуст, но при выборе * из места, где author_id = 1 возвращает 3 записи. – LotusH

ответ

1

Попробуйте это:

SELECT p.id 
    FROM place_user_relation r JOIN place p ON p.id = r.place_id 
WHERE p.author_id = 1 
    OR r.user_id = 1 
+0

Ну, это правильный ответ, и я написал в своем вопросе, что я пробовал это, это была ошибка из-за типографии ... Спасибо за ваши усилия в любом случае. – LotusH

+0

Этот запрос неполный, кажется, что мы должны использовать правое соединение вместо соединения и добавить 'group by r.place_id'. Поскольку, если вы используете join, результат не будет содержать место, которое не имеет отношения к пользователям (не имеет записи в place_user_relation) и повторяющихся строк одного места, в котором есть несколько записей в таблице place_user_relation. Я не знаю почему, но я просто попробовал это ... – LotusH

0
SELECT r.*,p.* FROM place_user_relation as r 
JOIN place as p 
ON p.place_id=r.place 
WHERE r.user_id=1 
union 
SELECT r.*,p.* FROM place_user_relation as r, place as p 
    WHERE r.user_id=1 AND p.author_id=1 
0

MySQL, вероятно, просто не нравится тот факт, что одним из условий в предложении ON только ссылающийся одна из таблиц. Попробуйте сделать это CROSS JOIN и переместить все условия в предложении WHERE, и используя ИСТИНА как предложение ON (ВКЛ, поскольку, по-видимому требуется) ...

SELECT r.*,p.* FROM place_user_relation as r 
CROSS JOIN place as p 
ON true 
WHERE (p.place_id=r.place OR p.author_id=1) and r.user_id=1 

СОЮЗ решение было предложено @ Арнон-Rotem -gal-oz также должен работать.

Смежные вопросы