Я застреваю в запросе. Надеюсь, кто-то может помочь мне здесь.SQL. Left Join и Null значение, когда столбец не существует
У меня есть эти 4 таблицы:
Таблица: детали
id_items
1
Таблица: items_atr_currencies_match
id_items_atr_currencies_match | id_items_atr_currencies | id_items
1 | 1 | 1
Таблица: items_atr_currencies_translations
id_items_atr_currencies_translations | id_items_atr_currencies | id_language_code | translation
1 | 1 | 1 | $
Таблица: items_atr_currencies
id_items_atr_currencies
1
Таблица: языки
id_languages | language_code
1 | es
2 | en
Мой запрос:
SELECT
id_items,
iact3.translation AS currency
FROM
items i
LEFT JOIN
items_atr_currencies_match AS iacm3 ON iacm3.id_items = i.id_items
LEFT JOIN
items_atr_currencies AS iac3 ON iac3.id_items_atr_currencies = iacm3.id_items_atr_currencies
LEFT JOIN
items_atr_currencies_translations AS iact3 ON iact3.id_items_atr_currencies = iacm3.id_items_atr_currencies
LEFT JOIN
languages AS l ON l.id_languages = iact3.id_language_code OR iact3.id_language_code IS NULL
WHERE
i.id_items = 1
AND l.language_code = "en"
Ожидаемый результат:
id_items | currency
1 | null
Получение 0 результат вместо
Я думаю, что у меня отсутствует что-то вроде «ИЛИ iact3.id_language_code не существует» в последней ЛЕВЫМ СОЕДИНЕНИЕМ, но я не знаю, как это сделать.
Он отлично работает, когда таблица items_atr_currencies_match не имеет данных или когда таблица items_atr_currencies_translations имеет перевод, но не тогда, когда есть данные, и перевод не существует.
Спасибо заранее
* UPDATE *
Наконец этот запрос делает то, что я хочу:
SELECT
i.id_items,
iact3.translation AS currency
FROM
items i
LEFT JOIN
languages AS l ON l.language_code = 'en'
LEFT JOIN
items_atr_currencies_match AS iacm3 ON iacm3.id_items = i.id_items
LEFT JOIN
items_atr_currencies_translations AS iact3 ON iact3.id_items_atr_currencies = iacm3.id_items_atr_currencies
AND l.id_languages = iact3.id_language_code
LEFT JOIN items_atr_currencies AS iac3 ON iac3.id_items_atr_currencies = iacm3.id_items_atr_currencies
WHERE
i.id_items = 1
Все, что я должен был сделать, это переместить язык LEFT JOIN к и найдите там код языка.
Вы, вероятно, нужно переместить последнее условие в объединение: 'LEFT JOIN языки AS л о l.id_languages = iact3.id_language_code И l.language_code = "EN" ГДЕ i.id_items = 1'. Основное правило для Внешних объединений: conditons на внешней таблице обычно являются частью WHERE, а условия для внутренней таблицы добавляются в 'ON' – dnoeth
Привет @dnoeth, я получаю результат« 1 | $ », но перевод« en »не выполняется 't выходы. Не следует получать 1 | null вместо? Это то, что я ожидаю. Спасибо –