Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取具有列值的表联接_Sql_Join - Fatal编程技术网

Sql 获取具有列值的表联接

Sql 获取具有列值的表联接,sql,join,Sql,Join,如何使用列值联接表 我有以下三个表格: 消息\u表 ----------------------------------------------------------------------------- msg_id | msg_sub | msg_to | to_user_type | msg_from | from_user_type --------------------------------------------------------------------

如何使用列值联接表

我有以下三个表格:

  • 消息\u表

    -----------------------------------------------------------------------------
    msg_id  | msg_sub   | msg_to    | to_user_type  | msg_from  | from_user_type
    -----------------------------------------------------------------------------
    001     | test      | 88        | manager       | 42        | admin
    002     | test2     | 88        | manager       | 94        | manager
    
    -------------------------—
    admin_id    | admin_name
    -------------------------—
    001         | Super Admin
    
    ---------------------------
    manager_id  | manager_name
    ---------------------------
    88          | Mandela
    94          | Kristen
    
  • 管理表

    -----------------------------------------------------------------------------
    msg_id  | msg_sub   | msg_to    | to_user_type  | msg_from  | from_user_type
    -----------------------------------------------------------------------------
    001     | test      | 88        | manager       | 42        | admin
    002     | test2     | 88        | manager       | 94        | manager
    
    -------------------------—
    admin_id    | admin_name
    -------------------------—
    001         | Super Admin
    
    ---------------------------
    manager_id  | manager_name
    ---------------------------
    88          | Mandela
    94          | Kristen
    
  • manager\u表

    -----------------------------------------------------------------------------
    msg_id  | msg_sub   | msg_to    | to_user_type  | msg_from  | from_user_type
    -----------------------------------------------------------------------------
    001     | test      | 88        | manager       | 42        | admin
    002     | test2     | 88        | manager       | 94        | manager
    
    -------------------------—
    admin_id    | admin_name
    -------------------------—
    001         | Super Admin
    
    ---------------------------
    manager_id  | manager_name
    ---------------------------
    88          | Mandela
    94          | Kristen
    
如何使用SQL查询获得所需的输出,如下所示。即。 满足以下条件时,根据列值联接表:

  • 如果
    user\u type=admin
    ,那么它应该与
    admin\u表
    连接

  • 如果
    user\u type=manager
    ,那么它应该与
    manager\u表
    连接

  • 所需输出:

    -----------------------------------------------------
    msg_id  | msg_sub   | msg_to_name   | msg_from_name
    -----------------------------------------------------
    001     | test      | Mandela       | Super Admin
    002     | test2     | Mandela       | Kristen
    
    即根据列值获取联接sql查询


    编辑:

    -----------------------------------------------------
    msg_id  | msg_sub   | msg_to_name   | msg_from_name
    -----------------------------------------------------
    001     | test      | Mandela       | Super Admin
    002     | test2     | Mandela       | Kristen
    
    我想从sql查询中获取数据,而不是从服务器端编码中获取数据

    我试着从Winfred的想法(已回答)提出这个问题

    然而,我无法理解


    msg\u by\u usertype
    是基于列的,其中值
    manager
    则应选择
    manager\u table
    ,如果是admin to
    admin\u table

    ,据我所知,您可以尝试以下方法:

        SELECT msg_id,  
         msg_body,  
         usersBy.userName AS msg_by, 
         usersTo.userName AS msg_to,  
         msg_by_usertype
        FROM messages
        INNER JOIN 
        (SELECT admin_id As id, admin_name as userName
          FROM admin_table         
         UNION         
         SELECT manager_id As id, manager_name as userName
          FROM manager_table ) usersTo ON msg_to = usersTo.id  
    
         INNER JOIN 
        (SELECT admin_id As id, admin_name as userName
          FROM admin_table        
         UNION         
         SELECT manager_id As id, manager_name as userName
          FROM manager_table ) usersBy ON msg_by = usersBy.id  
    

    下面是一个例子,看看它是如何工作的。(只有当您的管理员不能像经理一样拥有相同的id时,它才起作用。id在两个表中都应该是唯一的。)

    请使用下面的SQL语句

    SELECT msg_id,  
         msg_body,  
         usersBy.userName AS msg_by, 
         usersTo.userName AS msg_to,  
         msg_by_usertype
    FROM messages
    INNER JOIN 
        (SELECT admin_id As id, admin_name as userName,'admin' as usertype
          FROM admin_table         
         UNION         
         SELECT manager_id As id, manager_name as userName,'manager' as usertype
          FROM manager_table ) usersTo 
          ON msg_to = usersTo.id  and  msg_by_usertype = usersTo.usertype 
    

    如果我没弄错你的问题,你想要这样的结果吗

    MSG_ID      MSG_BODY    MSG_TO      BY           MSG_BY_USERTYPE 
    ----------  ----------  ----------  -----------  --------------- 
    001         test        adm1        managone     manager         
    002         sadff       adm1        adm3?        admin   
    
    如果是这样,你可以用这个

    SELECT MSG_ID, MSG_BODY, MSG_TO,                                        
         CASE                                                               
             WHEN MSG_BY_USERTYPE = 'admin' THEN COALESCE(                  
                  (SELECT ADMIN_NAME FROM ADMIN_TABLE                       
                   WHERE  MSG_BY = ADMIN_ID), RTRIM(MSG_BY) CONCAT '?')     
             WHEN MSG_BY_USERTYPE = 'manager' THEN COALESCE(                
                  (SELECT MANAGER_NAME FROM MANAGER_TABLE                   
                   WHERE  MSG_BY = MANAGER_ID), RTRIM(MSG_BY) CONCAT '?')   
             ELSE ' '                                                       
         END AS BY,                                                         
     MSG_BY_USERTYPE                                                        
     FROM MESSAGES 
    

    您要检索哪些列?此外,这些表之间的关系如何?示例消息表和管理表?他们的链接栏是什么?我编辑了这个问题,请看一看。