Mysql 如何通过比较表a和表b记录来创建新表?

Mysql 如何通过比较表a和表b记录来创建新表?,mysql,sql,database,Mysql,Sql,Database,我有两个表表A和表B比较每个字段,并创建一个表C,将数字转换为映射的颜色 表A包括: n1 n2 n3 n4 10 40 16 30 30 40 16 10 Red Blue 10 16 40 30 表B包括: n1 n2 n3 n4 10 40 16 30 30 40 16 10 Red Blue 10 16 40 30 根据@草莓建议更新的表B包含: n_val color 10 red 40

我有两个表表A和表B比较每个字段,并创建一个表C,将数字转换为映射的颜色

表A包括:

n1 n2 n3 n4   
10 40 16 30    
30 40 16 10
Red Blue    
10   16   
40   30
表B包括:

n1 n2 n3 n4   
10 40 16 30    
30 40 16 10
Red Blue    
10   16   
40   30
根据@草莓建议更新的表B包含:

n_val color    
10   red   
40   red
16   blue
30   blue
我希望表C按如下方式输出:

n1   n2  n3   n4    
Red  Red Blue Blue   
Blue Red Blue Red

如何在SQL中执行此操作标准化设计可能如下所示:

n1   n2  n3   n4    
Red  Red Blue Blue   
Blue Red Blue Red
表A

id  n n_val
101 1 10  
102 1 30 

101 2 40 
102 2 40 

101 3 16 
102 3 16

101 4 30   
102 4 10
表B

n_val colour
   10 red
   16 blue
   30 blue
   40 red 

这是一个奇怪的查询,但它提供了预期的结果

SELECT 
   CASE WHEN n1 IN (SELECT Red FROM tableB) THEN 'Red' ELSE 'Blue' END as n1,
   CASE WHEN n2 IN (SELECT Red FROM tableB) THEN 'Red' ELSE 'Blue' END as n2,
   CASE WHEN n3 IN (SELECT Red FROM tableB) THEN 'Red' ELSE 'Blue' END as n3,
   CASE WHEN n4 IN (SELECT Red FROM tableB) THEN 'Red' ELSE 'Blue' END as n4
FROM tableA

这里有一个令人不快的查询,它提供了预期的结果

select  (select colour from
            (
            select 'red' colour, red id from tableb
            union all 
            select 'blue',blue from tableb
            ) s where s.id = tablea.n1
            ) n1,
            (select colour from
            (
            select 'red' colour, red id from tableb
            union all 
            select 'blue',blue from tableb
            ) s where s.id = tablea.n2
            ) n2,
                        (select colour from
            (
            select 'red' colour, red id from tableb
            union all 
            select 'blue',blue from tableb
            ) s where s.id = tablea.n3
            ) n3,
                        (select colour from
            (
            select 'red' colour, red id from tableb
            union all 
            select 'blue',blue from tableb
            ) s where s.id = tablea.n4
            ) n4
from tablea;

+------+------+------+------+
| n1   | n2   | n3   | n4   |
+------+------+------+------+
| red  | red  | blue | blue |
| blue | red  | blue | red  |
+------+------+------+------+
2 rows in set (0.00 sec)

看起来你想让我们为你写些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在海报已经试图自己解决问题时才提供帮助。演示这项工作的一个好方法是包括您迄今为止编写的代码、示例输入(如果有)、预期输出和实际获得的输出(控制台输出、回溯等)。你提供的细节越多,你可能得到的答案就越多。查看和.Perfect comment@Albertomoroth这类问题是一个设计拙劣的方案的症状实际上,@草莓,我认为这类问题是一个SQL讲师试图想出自己的“聪明”版本的FizzBuzz的症状。有时治疗比疾病更糟糕这是对他的数据的批评,这不是对他的回答question@vlemaistre我认为这是一个答案;事实上,唯一的答案是:要么尊重规范化设计的原则,要么不要为RDBMS操心。我从评论中注意到OP已经(部分)相应地重新设计了他们的表格。Joakim我采纳了@草莓的建议,按照建议调整了表格b,并保留了表格a的原始数据。我尝试过使用您的查询,但没有成功,我如何调整它,以便在color列中选择值,而不是'Red'和'Blue'@Tony.C我不明白为什么我需要更新我的答案,因为这没有多大改进。为了获得更好的解决方案,您需要修改两个表,而不仅仅是oneJoakim。如果我能够从颜色列中获取值,那么这将是一个更具可伸缩性的解决方案,因为我不需要在每次需要新颜色时向查询添加新颜色。