将连接的表连接到自身

mv1qrgav  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(238)

我有一个数据库表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
wn9m85ua

wn9m85ua1#

多亏@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条件应用于两个表,因此获取一种语言id的翻译,并匹配不同语言id的任何翻译(如果存在)。

相关问题