Mysql 行值是第二个表的列名,需要第二个表的结果

Mysql 行值是第二个表的列名,需要第二个表的结果,mysql,Mysql,我需要从两个表中创建一个视图 表1 app_id cat_id approver level proj_id 1 1 pm_id 1 731 1 2 dm_id 2 843 1 3 dm_id 1 859 2 4 bo_id 1 859

我需要从两个表中创建一个视图

表1

  app_id    cat_id  approver    level   proj_id

  1            1    pm_id         1       731
  1            2    dm_id         2       843
  1            3    dm_id         1       859
  2            4    bo_id         1       859
表2

  proj_id   pm_id   dm_id   bo_id

  731       100102  100034  100121
  843       123121  145721  104321
  859       112312  132434  132435
我的审批人id在表2中,表1表示根据级别谁是项目的审批人。我想为pm、dm和bo的待批准列表创建一个视图

e、 g.结果表

app_id  cat_id  approver

1         1      100102
1         2      145721
1         3      132434
2         4      132435
使用leftjoin将两个表连接在一起,然后使用case何时获得批准者

select
    table1.app_id,
    table1.cat_id,
    case when table1.approver = 'pm_id' then table2.pm_id
         when table1.approver = 'dm_id' then table2.dm_id
         when table1.approver = 'bo_id' then table2.bo_id
    end as approver
from table1
left join table2 on table1.proj_id = table2.proj_id
请参阅rextester中的

编辑:

如果您有动态审批人,请尝试以下操作:

SET @sql = NULL;
SELECT
  CONCAT('CASE', GROUP_CONCAT(DISTINCT
      CONCAT(' WHEN table1.approver = ''',
      approver,
      ''' THEN table2.', approver) SEPARATOR ' '), ' END AS approver'
  ) INTO @sql
FROM table1;


SET @sql = CONCAT('SELECT table1.app_id, table1.cat_id, ', @sql, ' FROM table1 LEFT JOIN table2 ON table1.proj_id = table2.proj_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
还有一个内置测试仪

创建视图:


内部连接选择table1.app_id,table1.cat_id,table2.pm_id作为审批人,从table1.proj_id=table2.proj_id中选择table1.app_id,table1.cat_id,table2.pm_id作为审批人。下面是一些堆栈溢出文档抱歉@dragandrop,如果是这样的话,我就不会在这个论坛上提问了。我只是不需要pm_id,我需要表2中的列值,其中的列名值来自表1。请检查结果表如果表1中有10个不同的批准人,我应该写10个不同的案例吗?我认为是的。然而,如果您确实有超过10个不同的审批人,那么在表2中应该有相应的列,这是您的表的设计吗?如果是,动态sql将解决太多不同的情况@用户2483712是。你是对的,目前至少有6个级别的im\u id、pm\u id、dm\u id、bo\u id、hr\u id和am\u id。他们可以增加这些。我需要表2中的列值,其中的列名值来自表1。请检查结果table@user2483712检查编辑部分。非常感谢您的选择,有一个问题我可以在单个查询中执行此操作,因为我需要将其创建为视图而不是存储过程?
create view view1
as
select
    table1.app_id,
    table1.cat_id,
    case when table1.approver = 'pm_id' then table2.pm_id
         when table1.approver = 'dm_id' then table2.dm_id
         when table1.approver = 'bo_id' then table2.bo_id
    end as approver
from table1
left join table2 on table1.proj_id = table2.proj_id