Объединить две таблицы с помощью или - PullRequest
1 голос
/ 28 марта 2020

У меня есть эти таблицы. В одном тексте много-много элементов writer, line

ttext_obj таблица

test obj
1    text1
2    text2
3    text3
4    text4

text_obj_writers таблица

text writer
1    2
2    3
2    4

text_obj_line таблица

text line
1    2
4    3
1    4

Итак, я хочу выбрать строки text_obj, в которых по крайней мере один writer или один line.

Для теперь я сделал код, подобный этому.

Идентификатор text_obj, у которого есть хотя бы один write

SELECT text.id  FROM `text_obj` text 
inner join text_obj_writers writer 
on writer.obj_id = text.id  group by text.id

//it returns
1
2

Идентификатор text_obj, у которого есть хотя бы один line

SELECT text.id  FROM `text_obj` text 
inner join text_obj_lines line 
on line.obj_id = text.id  group by text.id

//it returns
1
4

Но я хочу взять or из этих

1
2
4

Как я могу объединить две таблицы с помощью или?

Ответы [ 3 ]

1 голос
/ 28 марта 2020

Использовать exists:

select o.*
from text_obj o
where exists (select 1
              from text_obj_writers tow 
              where tow.obj_id = o.id
             ) or
      exists (select 1
              from text_obj_lines tol 
              where tol.obj_id = o.id
             ) ;

Это намного лучше, чем при использовании агрегации, поскольку вам не нужно удалять дубликаты после объединения таблиц.

1 голос
/ 28 марта 2020

Вы можете сделать это с помощью UNION, который также удалит дубликаты:

select obj_id id from test_obj_writers
union
select obj_id id from test_obj_line

Я предполагаю, что все obj_id с обеих таблиц существуют в таблице text_obj.

1 голос
/ 28 марта 2020

Вы можете использовать exists:

select o.*
from ttext_obj o
where 
    exists (select 1 from text_obj_writers writer w where w.obj_id = o.id)
    or exists (select 1 from text_obj_lines l where l.obj_id = o.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...