MySQL - 在多个 JOIN 匹配项上添加列
MySQL - Add columns on multiple JOIN matches
我在查询方面遇到了一些困难,或者至少在找到一种使其熟练工作的方法方面遇到了困难。
总结一下这个问题,假设我有两个像 theese 这样的表:
TABLE 1:
id_product
id_category
A1
1
A2
2
A3
3
TABLE 2:
id_category
id_lang
description
1
1
Category 1 IT description
1
2
Category 1 EN description
1
3
Category 1 DE description
2
1
Category 2 IT description
2
2
Category 2 EN description
2
3
Category 2 DE description
其中,如果我考虑 id_category 进行 JOIN,我当然有多个匹配项,适用于每种可用语言。
我想要的结果是这样的:
id_product
id_category
IT_desc
EN_desc
DE_desc
A1
1
Category 1 IT description
Category 1 EN description
Category 1 DE description
A2
2
Category 2 IT description
Category 2 EN description
Category 2 DE description
所以将所有匹配项放在多个列中,以便在单个条目中查看不同的语言描述。
我唯一能做的就是有多个连接,每次都使用不同的语言,比如:
SELECT *
FROM table1 AS t1
LEFT JOIN table2 AS t2_IT
ON t2_IT.id_lang = 1 AND t1.id_category = t2_IT.id_category
LEFT JOIN table2 AS t2_EN
ON t2_EN.id_lang = 2 AND t1.id_category = t2_EN.id_category
LEFT JOIN table2 AS t2_DE
ON t2_DE.id_lang = 3 AND t1.id_category = t2_DE.id_category
这个方法确实有效,但我想知道是否有更好的替代方法,它不涉及每次乘法连接,当涉及到更多数据时,这可能会很慢。
谢谢大家!
您可以加入群组 table
SELECT t1.`id_product`, t1.`id_category`,
MAX(IF( `id_lang` = 1 , `description`, NULL)) IT_desc,
MAX(IF( `id_lang` = 2 , `description`, NULL)) EN_desc,
MAX(IF( `id_lang` = 3 , `description`, NULL)) DE_desc
FROM table1 t1 INNER JOIN table2 t2 ON t1. `id_category` = t2.`id_category`
GROUP BY t1.`id_product`, t1.`id_category`
id_product | id_category | IT_desc | EN_desc | DE_desc
:--------- | ----------: | :------------------------ | :------------------------ | :------------------------
A1 | 1 | Category 1 IT description | Category 1 EN description | Category 1 DE description
A2 | 2 | Category 2 IT description | Category 2 EN description | Category 2 DE description
db<>fiddle here
我在查询方面遇到了一些困难,或者至少在找到一种使其熟练工作的方法方面遇到了困难。 总结一下这个问题,假设我有两个像 theese 这样的表:
TABLE 1:
id_product | id_category |
---|---|
A1 | 1 |
A2 | 2 |
A3 | 3 |
TABLE 2:
id_category | id_lang | description |
---|---|---|
1 | 1 | Category 1 IT description |
1 | 2 | Category 1 EN description |
1 | 3 | Category 1 DE description |
2 | 1 | Category 2 IT description |
2 | 2 | Category 2 EN description |
2 | 3 | Category 2 DE description |
其中,如果我考虑 id_category 进行 JOIN,我当然有多个匹配项,适用于每种可用语言。 我想要的结果是这样的:
id_product | id_category | IT_desc | EN_desc | DE_desc |
---|---|---|---|---|
A1 | 1 | Category 1 IT description | Category 1 EN description | Category 1 DE description |
A2 | 2 | Category 2 IT description | Category 2 EN description | Category 2 DE description |
所以将所有匹配项放在多个列中,以便在单个条目中查看不同的语言描述。 我唯一能做的就是有多个连接,每次都使用不同的语言,比如:
SELECT *
FROM table1 AS t1
LEFT JOIN table2 AS t2_IT
ON t2_IT.id_lang = 1 AND t1.id_category = t2_IT.id_category
LEFT JOIN table2 AS t2_EN
ON t2_EN.id_lang = 2 AND t1.id_category = t2_EN.id_category
LEFT JOIN table2 AS t2_DE
ON t2_DE.id_lang = 3 AND t1.id_category = t2_DE.id_category
这个方法确实有效,但我想知道是否有更好的替代方法,它不涉及每次乘法连接,当涉及到更多数据时,这可能会很慢。
谢谢大家!
您可以加入群组 table
SELECT t1.`id_product`, t1.`id_category`, MAX(IF( `id_lang` = 1 , `description`, NULL)) IT_desc, MAX(IF( `id_lang` = 2 , `description`, NULL)) EN_desc, MAX(IF( `id_lang` = 3 , `description`, NULL)) DE_desc FROM table1 t1 INNER JOIN table2 t2 ON t1. `id_category` = t2.`id_category` GROUP BY t1.`id_product`, t1.`id_category`
id_product | id_category | IT_desc | EN_desc | DE_desc :--------- | ----------: | :------------------------ | :------------------------ | :------------------------ A1 | 1 | Category 1 IT description | Category 1 EN description | Category 1 DE description A2 | 2 | Category 2 IT description | Category 2 EN description | Category 2 DE description
db<>fiddle here