У меня есть таблица базы данных, словарь, в котором есть две строки и идентификатор языка.
Столбцы:
id
product_id
key
translation
language_id
Другая таблица, dictionary_versions, просто содержит dictionary_id и версию перевода
id
dictionary_id
version_id
У меня есть два разных перевода в таблице для каждого ключа, но иногда только один перевод для ключа. Я ищу способ получить все переводы одного языка и, если есть, перевод идентификатора другого языка.
Я ищу все переводы одного language_id и organizer_id и одной версии. Я попытался создать временную таблицу со всеми значениями того, с чем сравнивал, затем выполнил левое соединение временной таблицы с таблицей словаря, чтобы получить все переведенные значения нужного языка, и если есть какие-либо переводы другого языка , включи те.
Проблема в том, что это происходит медленно, когда есть 10000 переводов для двух языков. Есть ли лучший способ присоединить таблицу к себе, используя таблицу dictionary_versions в качестве предложения where для обоих?
SELECT
d.*
FROM
dictionary d
LEFT JOIN
dictionary_versions dv ON dv.dictionary_id = d.id
LEFT JOIN
dictionary d2
LEFT JOIN
dictionary_versions dv2 ON d2.id = dv2.dictionary_id
ON
d2.key = d.key
WHERE
d.product_id = 1 AND dv.version_id = 3
AND
d.language_id = 1
LIMIT
0,10
Это был один из запросов, которые я пробовал. Однако, если существует несколько версий, он получает все версии таблицы fd2, что приводит к неточностям данных.
Другой способ, которым я пытался, был с временной таблицей, это работает, но медленно. это делается в два запроса:
CREATE TEMPORARY TABLE IF NOT EXISTS dictionary_temp_1
AS (
SELECT d.* FROM `dictionary` AS `d`
LEFT JOIN `dictionary_versions` AS `dv` ON dv.dictionary_id = d.id
WHERE d.product_id = 1 AND dv.version_id = 3 AND d.language_id = 1
ORDER BY fd.key ASC LIMIT 0,10 )
Второе:
SELECT
d.key,
d2.key AS toKey,
d.translation AS `1`,
d2.translation AS `2`
FROM
`dictionary` AS `d`
LEFT JOIN
`dictionary_versions` AS `dv` ON d.id = dv.dictionary_id
LEFT JOIN
`dictionary_temp_1` AS `d2` ON d2.key = d.key
WHERE
d.product_id = 1 AND dv.version_id = 3 AND d.language_id = 1
ORDER BY
d.key ASC LIMIT 0,10