Есть две таблицы. Назвём их table1 и table2. Связь между ними many to many через table3.
Вопрос такой: есть у меня запись из table1, у которой есть связанная с ним запись из table2, которая, в свою очередь, связанна с несколькими из table1 (получается такой себе граф). Как мне вытянуть все записи из table1 по таким связям?
Есть вариант с использованием WITH RECURSIVE, думаю, но не особо понимаю, как сформировать запрос
Для правильного вопроса надо знать половину ответа
На один уровень table1 -> table2 -> table1:
SELECT DISTINCT `t3b`.`table1_id`
FROM `table3` AS `t3a`
JOIN `table3` as `t3b` ON `t3b`.`table2_id` = `t3a`.`table2_id`
AND `t3b`.`table1_id` != `t3a`.`table1_id`
WHERE `t3a`.`table1_id` = :id
WITH RECURSIVE linked(id, path) AS (
SELECT :id,
ARRAY[:id]
UNION ALL
SELECT t3b.table1_id,
path || t3b.table1_id
FROM table3 AS t3a, table3 AS t3b, linked AS l
WHERE t3a.table1_id = l.id
AND t3b.table2_id = t3a.table2_id
AND t3b.table1_id != t3a.table1_id
AND NOT (t3b.table1_id = ANY(path))
)
SELECT * FROM linked;