Как сделать выборку из нескольких таблиц с помощью оператора IN?
Помогите разобраться как сделать выборку из нескольких таблиц с одинаковым столбцом (например id), где исходные значения передаются в виде строки с помощью оператора IN ('val1', 'val2', 'val3' ... )?
Пробовал с помощью JOIN ON, но он выбирает только общие во всех таблицах.
select t1.*, t2.*
from table1 as t1
join table2 as t2 on t2.id_to_table1 = t1.id -- вероятно, у вас сомнения, как пишется выражение в клаузе ON
where t1.id in (1, 2, 5)
Все таки нужно изучить вашу предметную область, чтобы понять, зачем вы сделали две таблицы для однотипных сущностей, возможно, нужно было в структуру данных ввести какой-нибудь тип события, тогда бы не нужна была дублирующая вторая таблица, а нужна была бы таблица- справочник типов событий. Возможно и имеет смыл разделять данные на две таблицы, если у вас события отличаются, например, свойством периодичности, но опять же это нужно смотреть с высоты знания предметной области.
Если вы тип события не добавили изначально в структуру, то будете эмулировать его в каждом запросе полем t_type, такой уж будет костыль.))
select a.*
from
(
select 'from_t1' t_type, t1.date, t1.event from t1 where t1.date = :date
union all
select 'from_t2' t_type, t2.date, t2.event from t2 where t2.date = :date
) a
alexalexes, Благодарю, кажется оператор union all справляется с задачей.
1 таблица это даты праздников, также в нее включены "последние пятницы" и "3 среды" например. Но также есть уникальные праздники для каждого года - это 2 таблица. Плюс планируется, что юзер будет устанавливать свои события со своими датами, и наверно придется делать еще одну таблицу.
Опять же можно было обойтись одной таблицей:
EVENT
id - идентификатор события,
event_type_id - тип события, внешний ключ,
date - дата события
event - описание события.
Справочник EVENT_TYPE
id - идентификатор типа события,
type_name - наименование типа
Типичный запрос бы выглядел так:
select t1.id, t1.event_type_id, t2.type_name, t1.date, t1.event
from event t1
join evet_type t2 on t1.event_type_id = t2.id
where
(t1.event_type_id = 1 and Month(t1.date) = Month(STR_TO_DATE(:date, '%d.%m.%Y')) and Day(t1.date) = Day(STR_TO_DATE(:date, '%d.%m.%Y'))) -- так получаем периодичные события (тип id = 1 ), год в t1.date игнорируем
OR
(t1.event_type_id <> 1 and t1.date = STR_TO_DATE(:date, '%d.%m.%Y')) -- а так получаем не периодичные события, отличные от типа 1.
Чтобы потом ввести еще один тип события, достаточно добавить в справочник этот тип, и если он имеет какие-то особенности, то поправить where.