Выберите отдельный союз с составными ключами

Так,
Моя текущая проблема — создание языкового файла из php / pdo / mysql. Существует несколько языковых таблиц с одинаковой структурой, но приложение будет использовать только 2 для каждого запуска — потенциально неполный выбранный пользователем язык и полный запасной. На данный момент мы предполагаем, что английская таблица завершена, но любые таблицы перевода могут не быть, поэтому мы хотим, чтобы любые недостающие переводы были возвращены из английской.

Итак, скажем, таблицы lang_EN и lang_DE с разделом столбцов, тип, метка, содержимое

lang_en:

раздел: ‘admin’, тип: ‘button’, метка: ‘hello’, содержимое: ‘Hello World’

раздел: «admin», тип: «кнопка», ярлык: «до свидания», содержание: «Goodbye Cruel World»

lang_DE:

раздел: ‘admin’, тип: ‘button’, метка: ‘hello’, содержимое: ‘Hallo Welt’

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

Из-за ограничений сервера это должно быть сделано в одном запросе. Я застрял в мысли, что единственный способ сделать это — через профсоюз

ВЫБЕРИТЕ контент ИЗ language_EN
ГДЕ раздел = «админ»
AND type = ‘button’

СОЮЗ ОТЛИЧАЕТСЯ

SELECTcontent FROM language_DE
ГДЕ раздел = «админ»
AND type = ‘button’

с ожидаемыми результатами:
Hallo Welt
Прощай жестокий мир

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

Любые указатели будут с благодарностью.

0

Решение

Я нашел решение с помощью конструкторов подзапрос строки:

ВЫБЕРИТЕ содержимое ИЗ language_EN WHERE section = ‘admin’ AND type = ‘button’

ГДЕ (раздел, тип, метка) НЕ ВХОДИТ (ВЫБРАТЬ раздел, тип, метка ОТ language_DE)

UNION

ВЫБЕРИТЕ содержимое ИЗ language_DE WHERE section = ‘admin’ AND type = ‘button’

0

Другие решения

Я бы предложил этот подход:

(SELECT content
FROM language_DE
WHERE section = 'admin' AND type = 'button'
) UNION ALL
(SELECT content
FROM language_EN en
WHERE section = 'admin' and type = 'button' and
NOT EXISTS (SELECT 1
FROM language_DE de
WHERE de.section = en.section and de.type = en.type and de.label = en.label
)
)

Два преимущества перед вашим подходом. Во-первых, вы можете выбрать дополнительные столбцы и не беспокоиться о union distinct недостающие дубликаты. Во-вторых, он использует индексы и не требует дорогостоящей операции удаления дубликатов.

0