我有一个数据库表dictionary,它有两个字符串和一个语言id。
这些列是:
id
product_id
key
translation
language_id
另一个表dictionary\u versions只有dictionary\u id和翻译版本
id
dictionary_id
version_id
表中每个键有两种不同的翻译,但有时只有一种翻译。我正在寻找一种方法来获得一种语言的所有翻译,如果有的话,另一种语言id的翻译。
我期待得到一种语言和组织者的id和一个版本的所有翻译。我尝试创建一个临时表,其中包含我要比较的内容的所有值,然后在dictionary表上对临时表执行左联接,以获得所需语言的所有翻译值,如果有其他语言的翻译,则包括这些翻译。
问题是,当两种语言有10000种翻译时,速度会变慢。使用dictionary\u 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表的所有版本,从而导致数据不准确。
我试过的另一种方法,是用临时table,这很管用,但很慢。它通过两个查询完成:
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条答案
按热度按时间wn9m85ua1#
多亏@philipxy,我成功地找到了一个解决方案,并将这个答案作为参考。
这将在将子查询连接到表本身之前创建子查询。where条件应用于两个表,因此获取一种语言id的翻译,并匹配不同语言id的任何翻译(如果存在)。