Как предотвратить повторяющиеся строки в перекрестном соединении sql - PullRequest
1 голос
/ 08 апреля 2020

У меня есть книги, авторы и таблица ссылок. Я хочу получить все книги, в которых есть у их автора хотя бы одна из выбранных. Линк - это таблица со связями между ними: если вы хотите установить автора книги, вам нужно создать строку в ссылках с помощью внешних ключей book_id, author_id. Что я пытаюсь сделать:

SELECT * FROM books cross JOIN links
where user_id = 1 and
books.id = links.book_id and
links.author_id in (1, 2)

Что я получаю

Я хочу, чтобы как-то получить результат без дубликатов книг , но я не уверен, что это возможно. Что я могу сделать только с sql командами в этом случае?

1 Ответ

1 голос
/ 08 апреля 2020

Один из способов избежать дублирования - использовать exists с коррелированным подзапросом, а не join:

select b.* 
from books b
where exists (select 1 from links l where b.id = l.book_id and l.author_id in (1, 2))

. Здесь отображаются books, которые совпадают без их авторов.

Другим (возможно, менее эффективным) подходом является агрегирование и group_concat() для помещения всех подходящих авторов в одну строку:

select b.id, b.title, b.year, b.price, group_concat(l.author_id) author_ids
from books b
inner join links l on l.book_id = b.id
where l.author_id in (1, 2)
group by b.id, b.title, b.year, b.price
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...