Mysql 无公共键联接多个表

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

您好,我目前有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 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:

当可以使用数据处理单列值时,在特定行为中编码单列值是不好的做法(特别是因为所需的附加数据相对较小)为其他颜色添加其他记录意味着,如果添加了其他颜色,则用户不会自动允许该颜色作为选择,这可能不是预期的功能。