2017-02-15 3 views
0

У меня есть две таблицыКак использовать MySQL WHERE IN для двух отдельных таблиц

books_tbl:

blocks side-bar top-bar 
23,45 3,15  11,56 

pages_tbl:

id title 
1 ff 
3 
11 
15 

Я хочу, чтобы выбрать строки из pages_tbl, где идентификаторы страниц включали либо блоки, либо столбцы столбцов, либо столбцов тома в books_table ,

Как это обрабатывать?

+1

Исправьте структуру вашего стола. ** Никогда ** хранить несколько значений в одной ячейке. См. Раздел «Нормализация». – GurV

+0

@GurV: Это не моя собственная система. Я делаю некоторую реконструкцию в соответствии с клиентом. Так что это сложно сменить структуру struct. Можно ли это сделать, используя предложение WHERE IN? Помощь –

ответ

1

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

select p.id, p.title 
from 
    pages_tbl p inner join books_tbl b 
    on (
    find_in_set(p.id, b.blocks) 
    or find_in_set(p.id, b.side-bar) 
    or find_in_set(p.id, b.top-bar) 
) 
-- add where condition? 
group by p.id, p.title 
1

Вы должны действительно рассмотреть возможность фиксации вашей структуры таблицы. Никогда не храните несколько значений в одной ячейке. См. Раздел «Нормализация».

Как и в этом случае, вы не можете, попробуйте использовать функцию find_in_set.

select 
from pages_tbl p 
where exists (
    select 1 
    from books_tbl b 
    where find_in_set(
     p.id, 
     concat(b.blocks, ',', b.side_bar, ',', b.top_bar) 
     ) > 0 
); 

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

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