ПРИСОЕДИНЯЙТЕСЬ к двум таблицам, которые имеют общего деда, но не родителя - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь распаковать систему макетов, которая организует изображения и текст, например, так:

layout

С проблемой в том, что мне нужно (как-то) связать каждый text.content как с его записью, так и с первым images.filename, за которым следует .По сути, ввести двоюродных братьев.

В идеале я хотел бы получить что-то вроде:

| entry.id  | images.filename  | texts.content
|-----------|------------------|--------------
| 0         | img.jpg          | lorem  

Ранее я успешно связывал изображения с их записями, используя серию LEFT JOIN s, например:

SELECT entries.id, images.filename 
FROM images 
LEFT JOIN containers 
    ON images.container_id = containers.id 
LEFT JOIN layers 
    ON containers.layer_id = layers.id 
LEFT JOIN entries 
    ON layers.entry_id = entries.id

Но это не работает при попытке связать тексты с изображениями, потому что они не связаны напрямую.Вы должны подняться на начальный уровень, чтобы определить ассоциацию, но как вы затем отслеживаете лучшего кандидата для ближайшего изображения?

В настоящее время

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

SELECT entries.id, images.filename, texts.content
FROM entries, images, texts
LEFT JOIN containers a 
    ON texts.container_id = a.id 
LEFT JOIN containers b
    ON images.container_id = b.id 
LEFT JOIN layers 
    ON containers.layer_id = layers.id 
LEFT JOIN entries 
    ON layers.entry_id = entries.id

Хотя по некоторым причинам это все еще отбрасывает Not unique table/alias: 'entries'.

Таким образом, я пробовал использовать псевдонимы здесь (что на самом деле не похоже) и начал взламывать вопросов, связанных с подзапросами , но ... я исчерпалпоисковых терминов.

Возможно ли это вообще?

Для ясности, я не ищу здесь полного ответа, только некоторые подсказки о том, как я могу использовать JOIN дляследующее:

A) Отображение текстов и изображений и их ассоциаций (я думаю, что я здесь близко).

B) Ассоциирование одной текстовой записи с данными из любой записи изображенияследует за ним. .Сейчас это кажется невозможным, но я думаю, именно поэтому я спрашиваю людей, которые знают больше, чем я.

РЕДАКТИРОВАТЬ: обратите внимание, что может быть несколько слоев, содержащих изображения или тексты, и мне нужно вернуть всех текстов из каждой записи.

1 Ответ

2 голосов
/ 28 сентября 2019

ищет схему, кажется, вы могли бы попытаться использовать поддельную функцию агрегирования на основе объединения для выбора имени файла и текста

SELECT id, max(filename) filename, max(content) content 
FROM (
    SELECT entries.id, images.filename, NULL content
    FROM entries
        INNER JOIN layers 
            ON entries.id  = layers.entry_id
        INNER JOIN containers 
            ON containers.layer_id = layers.id
        INNER JOIN images 
            ON images.container_id = containers.id
    UNION ALL 
    SELECT entries.id, NULL, texts.content
    FROM entries
        INNER JOIN layers 
            on entries.id  = layers.entry_id
        INNER JOIN containers 
            on containers.layer_id = layers.id
        INNER JOIN texts 
        ON texts.container_id = containers.id ) t
GROUP BY id 
...