Mysql 无公共键联接多个表
您好,我目前有3个表,如下所示。表之间没有公共键 表1->联动装置表Mysql 无公共键联接多个表,mysql,sql,Mysql,Sql,您好,我目前有3个表,如下所示。表之间没有公共键 表1->联动装置表 ID Item Material Color 1 keypouch * yellow 2 wallet plastic * 3 card-holder leather gold 表2->材料表 ID Name 1 plastic 2 wool 3 leather 表3->颜色表 ID Co
ID Item Material Color
1 keypouch * yellow
2 wallet plastic *
3 card-holder leather gold
表2->材料表
ID Name
1 plastic
2 wool
3 leather
表3->颜色表
ID Color
1 Yellow
2 green
3 orange
我希望得到以下结果集
Item Material Color
keypouch plastic yellow
keypouch wool yellow
keypouch leather yellow
wallet plastic yellow
wallet plastic green
wallet plastic orange
card-holder leather gold
我想写一个SQL语句来连接这些表
在链接表中使用*意味着我们将从材质表或颜色表中检索所有值
我现在真的需要这个解决方案。我花了5个多小时试图解决这个问题。提前感谢您的帮助。一种可能的方法:
SELECT l.Item, m.name, c.Color
FROM linkage_Table AS l
INNER JOIN Material_Table AS m
ON l.Material = '*'
OR l.Material = m.name
INNER JOIN Color_Table AS c
ON l.Color = '*'
OR l.Color = c.Color
说明:必须构建查询,以便在相应字段中给出
'*'
时,将“material”和“color”表完全联接(交叉联接),或者通过这些字段的相等性联接。这正是我们在l.someField='*'或l.someField=joined.someField'子句上使用,而不是在表中使用*得到的结果。因为在源表中使用*后,联接不会拾取目标表中的多个条目,所以需要在数据库中为每个记录设置一个条目
ID项目材质颜色
1个钥匙袋塑料黄色
4钥匙袋羊毛黄
5钥匙袋皮革黄色
颜色也是一样。
此外,由于要基于公共列连接数据,因此通常更好(更快)地使用目标表的主键作为源表中要连接的列的主键。这允许联接使用索引并执行得更快。示例:
CREATE TABLE linkage_table (
id INT,
item VARCHAR(40),
material VARCHAR(40),
color VARCHAR(40)
);
CREATE TABLE material_table (
id INT,
name VARCHAR(40)
);
CREATE TABLE color_table (
id INT,
color VARCHAR(40)
);
INSERT INTO linkage_table VALUES (1, 'keypouch', '*', 'yellow');
INSERT INTO linkage_table VALUES (2, 'wallet', 'plastic', '*');
INSERT INTO linkage_table VALUES (3, 'card-holder', 'leather', 'gold');
INSERT INTO material_table VALUES (1, 'plastic');
INSERT INTO material_table VALUES (2, 'wool');
INSERT INTO material_table VALUES (3, 'leather');
INSERT INTO color_table VALUES (1, 'yellow');
INSERT INTO color_table VALUES (2, 'green');
INSERT INTO color_table VALUES (3, 'orange');
SELECT l.item AS Item, m.name AS Material, IFNULL(c.Color, l.color)
FROM linkage_table l
LEFT JOIN material_table m ON (l.material = m.name OR l.material = '*')
LEFT JOIN color_table c ON (l.color = c.color OR l.color = '*')
;
返回您想要的内容。不确定您的样本数据是否故意缺少“金色”
检查SQLFiddle:当可以使用数据处理单列值时,在特定行为中编码单列值是不好的做法(特别是因为所需的附加数据相对较小)为其他颜色添加其他记录意味着,如果添加了其他颜色,则用户不会自动允许该颜色作为选择,这可能不是预期的功能。