Mysql 根据表1中的列值合并两个表列在表2中的列值

Mysql 根据表1中的列值合并两个表列在表2中的列值,mysql,Mysql,我在表1中有2个columnName,数字,在表2中有4个columnName,Min,Max,Color 表1 columnNumber包含一个数值,该数值在表2min和Max中有一个范围 我的要求是根据名称列从表1中选择名称、编号和颜色 此外,若表1中的数值高于表2的最大值,则需要从颜色列中选择相同的行值 **Table1 sample data:** **Name Number** A 33 B 17 **Table2 sample data:** **N

我在表1中有2个columnName,数字,在表2中有4个columnName,Min,Max,Color

表1 columnNumber包含一个数值,该数值在表2min和Max中有一个范围

我的要求是根据名称列从表1中选择名称、编号和颜色

此外,若表1中的数值高于表2的最大值,则需要从颜色列中选择相同的行值

**Table1 sample data:**

**Name  Number**
A       33
B       17


**Table2 sample data:**

**Name  Min   Max    Color**
A       0     20     RED
A       21    44     Yellow
A       45    45     Green
B       0     0.9    Green
B       1     15.99  Yellow
B       16    16     RED

**Output**

**Name  Number  Color**
A       33      Yellow
B       17      Red
请让我知道任何关于上述问题的困惑


注意:此查询用于Tableau中的自定义SQL,因此不能使用CTE或else advance方法。

您的最终条件非常奇怪。但是,您可以简化逻辑:只需忽略max列并选择min小于或等于数字的最后一行:

select t1.*,
       (select t2.color
        from table2 t2
        where t1.name = t2.name and t2.min <= t1.number
        order by t2.min desc
        limit 1
       ) as color
from table1 t1;

那么任何超过45的东西都是绿色的?SQLFIDDLE也不错。我在您的查询中得到以下错误消息。原因是表2返回表1中单个名称行的3行结果。Msg 512,级别16,状态1,第1行子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。我唯一的问题是,合并将与Tableau自定义SQL一起工作,还是我可以使用任何其他方法?非常感谢您的努力。@Aditya我不知道tableau是什么。COALESCE的d目的是什么?正如我在google上所做的那样,但没有成功达到实际目的。如果表y中没有对应的行,换句话说,如果table1的数字大于table2 max的对应值,查询将使用与最大值关联的颜色。合并就像IFNULL一样。
SELECT x.*
     , COALESCE(y.color,z.color) color 
  FROM table1 x
  LEFT 
  JOIN table2 y 
    ON y.name = x.name 
   AND x.number BETWEEN y.min AND y.max
  JOIN 
     ( SELECT a.* 
         FROM table2 a 
         JOIN 
            ( SELECT name,MAX(max) max FROM table2 GROUP BY name ) b 
           ON b.name = a.name 
          AND b.max = a.max
     ) z 
    ON z.name = x.name;