mySQL-需要帮助创建以不同方式引用多个表的查询吗
我正在努力创建一个查询来从多个表中获取数据 以下是表格:-mySQL-需要帮助创建以不同方式引用多个表的查询吗,mysql,Mysql,我正在努力创建一个查询来从多个表中获取数据 以下是表格:- 我想查询基表和其他表,以得到以下行:- 因此,基表make_ID值需要引用makes表来填充结果中的make列。我已经设法解决了这个问题:- SELECT code, make, Model_ID, time FROM makes INNER JOIN base ON makes.ID = base.make_ID; 但是我发现model列很棘手,因为我需要从make获得结果,并使用该结果选择正确的表来获取模型。因此,查看第
我想查询基表和其他表,以得到以下行:- 因此,基表make_ID值需要引用makes表来填充结果中的make列。我已经设法解决了这个问题:-
SELECT code, make, Model_ID, time
FROM makes
INNER JOIN base
ON makes.ID = base.make_ID;
但是我发现model列很棘手,因为我需要从make获得结果,并使用该结果选择正确的表来获取模型。因此,查看第一行,我需要获取生成结果,即brillo,然后使用model_id中的id引用brillo表,以获得finepad
如何展开查询以执行此操作?如果您有任何见解,我们将不胜感激。正如Jerry所说,您需要一张表格
制作这样的模型
+---------------+---------+----------+------------+
| make_model_id | make_id | model_id | model |
+---------------+---------+----------+------------+
| 1 | 1 | 1 | finepad |
| 2 | 1 | 2 | harshpad |
| 3 | 2 | 1 | toothbrush |
| 4 | 2 | 2 | toothpaste |
| 5 | 3 | 1 | ovenchips |
| 6 | 3 | 2 | porkpie |
+---------------+---------+----------+------------+
^^ unique identifier
因此,在您的base
表中,您可以引用make\u model\u id
,而不是引用make\u id
,这是唯一的,因此您可以使用与makes
表相同的方式进行连接
SELECT code, make, Model_ID, time
FROM makes
INNER JOIN base
ON makes.ID = base.make_ID
INNER JOIN make_models
ON base.make_id = make_models.make_id
AND base.model_id = make_models.model_id;
SELECT base.code, makes.make, make_models.model, base.time
FROM base
JOIN make
ON base.make_id = makes.id
JOIN ( SELECT 1 as make_id, model_id, model
FROM brillo
UNION ALL
SELECT 2 as make_id, model_id, model
FROM colgate
UNION ALL
SELECT 3 as make_id, model_id, model
FROM mccaine
) as make_models
ON base.make_id = make_models.make_id
AND base.model_id = make_models.model_id
或:
如果无法更改模型,可以创建一个子查询来动态构建它。请参见如何基于makes
表中的id分配make\u id
SELECT code, make, Model_ID, time
FROM makes
INNER JOIN base
ON makes.ID = base.make_ID
INNER JOIN make_models
ON base.make_id = make_models.make_id
AND base.model_id = make_models.model_id;
SELECT base.code, makes.make, make_models.model, base.time
FROM base
JOIN make
ON base.make_id = makes.id
JOIN ( SELECT 1 as make_id, model_id, model
FROM brillo
UNION ALL
SELECT 2 as make_id, model_id, model
FROM colgate
UNION ALL
SELECT 3 as make_id, model_id, model
FROM mccaine
) as make_models
ON base.make_id = make_models.make_id
AND base.model_id = make_models.model_id
正如Jerry所说,你需要一张桌子,像这样制作模型
+---------------+---------+----------+------------+
| make_model_id | make_id | model_id | model |
+---------------+---------+----------+------------+
| 1 | 1 | 1 | finepad |
| 2 | 1 | 2 | harshpad |
| 3 | 2 | 1 | toothbrush |
| 4 | 2 | 2 | toothpaste |
| 5 | 3 | 1 | ovenchips |
| 6 | 3 | 2 | porkpie |
+---------------+---------+----------+------------+
^^ unique identifier
因此,在您的base
表中,您可以引用make\u model\u id
,而不是引用make\u id
,这是唯一的,因此您可以使用与makes
表相同的方式进行连接
SELECT code, make, Model_ID, time
FROM makes
INNER JOIN base
ON makes.ID = base.make_ID
INNER JOIN make_models
ON base.make_id = make_models.make_id
AND base.model_id = make_models.model_id;
SELECT base.code, makes.make, make_models.model, base.time
FROM base
JOIN make
ON base.make_id = makes.id
JOIN ( SELECT 1 as make_id, model_id, model
FROM brillo
UNION ALL
SELECT 2 as make_id, model_id, model
FROM colgate
UNION ALL
SELECT 3 as make_id, model_id, model
FROM mccaine
) as make_models
ON base.make_id = make_models.make_id
AND base.model_id = make_models.model_id
或:
如果无法更改模型,可以创建一个子查询来动态构建它。请参见如何基于makes
表中的id分配make\u id
SELECT code, make, Model_ID, time
FROM makes
INNER JOIN base
ON makes.ID = base.make_ID
INNER JOIN make_models
ON base.make_id = make_models.make_id
AND base.model_id = make_models.model_id;
SELECT base.code, makes.make, make_models.model, base.time
FROM base
JOIN make
ON base.make_id = makes.id
JOIN ( SELECT 1 as make_id, model_id, model
FROM brillo
UNION ALL
SELECT 2 as make_id, model_id, model
FROM colgate
UNION ALL
SELECT 3 as make_id, model_id, model
FROM mccaine
) as make_models
ON base.make_id = make_models.make_id
AND base.model_id = make_models.model_id
您是否能够更改此数据库的架构?我问的原因是,您可能需要的是一个make_model
表,该表为每个make分配唯一的标识符,这样可以更容易地获取后续模型。将表和数据发布为text@jerry M。感谢您的评论。“make”表和你的建议不一样吗?@michaepavlosmael我不这么认为。以Makes
中的id1
为例,它应该对应于brillo
。该ID也出现在表brillo
、colgate
和mccaine
中。因此,这不允许专门获取brillo产品。有很多方法可以解决这个问题,但从根本上说,应该更改数据库。如果你愿意的话,我很乐意将此作为回答。@JerryM。对,我想我明白了。因此,如果我将makes
中的ID
更改为一些独特的内容,例如makes\u ID
(并对包含模型的3个表执行相同操作),这是否是正确的方向?如果是这样的话,你能详细说明如何调整我的查询以适应它吗?你能改变这个数据库的模式吗?我问的原因是,您可能需要的是一个make_model
表,该表为每个make分配唯一的标识符,这样可以更容易地获取后续模型。将表和数据发布为text@jerry M。感谢您的评论。“make”表和你的建议不一样吗?@michaepavlosmael我不这么认为。以Makes
中的id1
为例,它应该对应于brillo
。该ID也出现在表brillo
、colgate
和mccaine
中。因此,这不允许专门获取brillo产品。有很多方法可以解决这个问题,但从根本上说,应该更改数据库。如果你愿意的话,我很乐意将此作为回答。@JerryM。对,我想我明白了。因此,如果我将makes
中的ID
更改为一些独特的内容,例如makes\u ID
(并对包含模型的3个表执行相同操作),这是否是正确的方向?如果是这样,您能否详细说明如何调整我的查询以适应这种情况?我想尝试避免为makes
和models
创建一个表。这个数据集非常小,但我想要一个可以处理数百个品牌的系统,每个品牌都有数百个模型。我面临的部分挑战是将每个make模型分组到单独的表中。我建议您不要创建多个表,而是将所有内容放在make\u models
中,正如我所理解的那样。如果我想不出别的办法,我想我会回到你的方法上来。非常感谢您的意见。我想尝试避免为品牌
和型号
设置一个表。这个数据集非常小,但我想要一个可以处理数百个品牌的系统,每个品牌都有数百个模型。我面临的部分挑战是将每个make模型分组到单独的表中。我建议您不要创建多个表,而是将所有内容放在make\u models
中,正如我所理解的那样。如果我想不出别的办法,我想我会回到你的方法上来。我感谢你的意见。