MySQL: Не вижу, как выбрать значение 1 столбца из связанной таблицы для связанных значений из 2 столбцов в первой таблице - PullRequest
1 голос
/ 10 июля 2020

Иногда мне трудно описать просто и найти в Интернете странные вещи, которые мне нужно сделать в MySQL, поэтому поиск в Интернете и заголовок вопроса могут нуждаться в объяснении.

Допустим, у меня есть таблица с именем routes, которая есть столбцы origin и destination, в каждом из которых хранится код порта, а затем другая таблица с именем ports со столбцом country.

Записи таблицы маршрутов выглядят так:

row1: origin -> ABC, destination -> DEF;
row2: origin -> GHI, destination -> JKL;

Записи в таблице портов выглядят так:

row1: port -> ABC, country -> US;
row2: port -> DEF, country -> PR;
row3: port -> GHI, country -> JM;
row4: port -> JKL, country -> CN;

Мне нужно, чтобы результат выглядел так:

origin -> ABC, destination -> GHI, og_country -> US, ds_country -> JM;
origin -> JKL, destination -> DEF, og_country -> CN, ds_country -> PR;

Мой псевдо-запрос выглядит так:

SELECT
    r.origin,
    r.destination,
    # p.og_country?
    # p.ds_country?? how?
FROM route r
ORDER BY r.origin, r.destination

Я пробовал добавить LEFT JOIN ports p ON p.port = r.origin OR p.port = r.destination (с также выбранными столбцами og_country и ds_country), но это создает посторонние строки с повторяющимися данными, например:

origin -> ABC, destination -> DEF, og_country -> US, ds_country -> null;
origin -> ABC, destination -> DEF, og_country -> null, ds_country -> PR;

Подвыборки работают для страны происхождения и страны назначения:

    (SELECT country FROM ports WHERE port = r.origin) AS og_country,
    (SELECT country FROM ports WHERE port = r.destination) AS ds_country,

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

Я пытался выполнить UNION, но проблема в том, что записи в таблицах не выровнены в одном направлении, где данные о маршрутах происхождения и назначения являются горизонтальными, а данные о странах портов - вертикальными! Просматривая примеры и документацию UNION, я даже не понимаю, как их связать.

Извините, я не умею это объяснять ... что типично для меня SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...