Присоединить объединенный стол к себе - PullRequest
0 голосов
/ 27 октября 2018

У меня есть таблица базы данных, словарь, в котором есть две строки и идентификатор языка.

Столбцы:

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

1 Ответ

0 голосов
/ 30 октября 2018

Мне удалось найти решение, используя это в качестве ссылки, благодаря @philipxy, который указал мне на этот ответ для справки.

SELECT d.key, d2.key AS toKey, d.translation AS `1`, d2.translation AS `2`
FROM dictionary d 
INNER JOIN dictionary_versions dv ON dv.dictionary_id = d.id 
LEFT JOIN (
    SELECT d.* 
    FROM `dictionary` AS `d`
    INNER JOIN `dictionary_versions` AS `dv` ON d.id = dv.dictionary_id 
    WHERE d.product_id = 1 AND dv.version_id = 3 AND d.language_id = 2
) d2 ON d2.key = d.key 
WHERE d.product_id = 1 AND dv.version_id = 3 AND d.language_id = 1 

Это создает подзапрос перед присоединением его к самой таблице. Условие where применяется к обеим таблицам, поэтому получают переводы для одного language_id и сопоставляют любые для другого language_id, если они существуют.

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