2015-08-07 3 views
1
select t.* FROM user_tq t join 
CASE when t.blogid = 0 then user_dp ELSE user_blog END b 
on t.uid = b.uid where ***; 

Я хочу присоединиться различные таблицы в соответствии с blogid, когда blogid является 0, присоединиться к user_dp, иначе присоединиться к user_blog.But он возвращает 1064 ошибку. Как решить эту проблему?О Mysql присоединиться случай, когда ошибка

+0

возможно дубликат [запроса MySQL, где РЕГИСТРИРУЙТЕСЬ зависит от ДЕЛУ] (http://stackoverflow.com/questions/6994843/mysql-query-where-join-depends-on-case) – artm

+0

b - ваш другой стол. ПРАВИЛЬНО? –

+0

b является псевдонимом таблицы соединений – Specs

ответ

0

Вы можете сделать это с помощью left join и фильтровать правильный результат по COALESCE

select t.* 
FROM user_tq t 
left join user_dp ud on t.blogid = 0 and t.uid = ud.uid 
left join user_blog ub on t.blogid != 0 and t.uid = ub.uid 
where 
COALESCE(ud.uid, ub.uid) IS NOT NULL and 
***; 

Для получения дополнительной информации см: MySQL query where JOIN depends on CASE

Если вы пытаетесь inner join to filter данные о состоянии тогда;

select * from (
    select t.* 
    FROM user_tq t 
    join user_dp ud on t.blogid = 0 and t.uid = ud.uid 
    union all 
    select t.* 
    FROM user_tq t 
    join user_blog ub on t.blogid != 0 and t.uid = ub.uid 
) as x 
where ****; 
+0

Спасибо, я попробовал, но он возвращает много повторных результатов. – Specs

+0

обновил ответ, попробуй второй. – Praveen

0

ПРИМЕНЕНИЕ:

select * FROM users t 
left join user_role r ON t.user_id = 0 AND r.user_id = t.user_id 
left join product_category c ON t.user_id != 0 AND c.user_id = t.user_id 
WHERE COALESCE(r.user_id, c.user_id) IS NOT NULL 
WHERE ***; 

Заменить пользователи, USER_ROLE и PRODUCT_CATEGORY с таблицами.

0

Другие ответы, представленные здесь, являются правильными решениями. Я отвечу «Почему я получу 1064» для вас.

Синтаксис, который вы написали, недействителен. Вы не можете «условно» присоединиться к таблице, как это.

Что вы можете сделать LEFT JOIN - который, в отличие от [INNER] JOIN означает «возвращение NULL для всех полей этой таблицы, если запись не соответствует условию соединения».

В сети есть лоты в LEFT vs INNER, а документы веб-сайта MySQL очень хорошо работают COALESCE.

Имейте игру и прочитайте, вы поймете, почему другие решения работают.


После отражения, я почувствовал, что это может принести дополнительные разъяснения.

Смотрите эту SQLFiddle: http://sqlfiddle.com/#!9/043b7/6

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