6

列の値を使用してテーブルを結合するにはどうすればよいですか?

以下にリストされている3つのテーブルがあります。

  • messages_table

    -----------------------------------------------------------------------------
    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_table

    -------------------------—
    admin_id    | admin_name
    -------------------------—
    001         | Super Admin
    
  • manager_table

    ---------------------------
    manager_id  | manager_name
    ---------------------------
    88          | Mandela
    94          | Kristen
    

以下に示すように、SQLクエリを使用して目的の出力を取得するにはどうすればよいですか。つまり、次の基準が満たされた場合に、列の値に関してテーブルを結合します。

  1. その場合user_type = adminは、と結合する必要がありadmin_tableます。

  2. その場合user_type = managerは、と結合する必要がありmanager_tableます。

必要な出力:

-----------------------------------------------------
msg_id  | msg_sub   | msg_to_name   | msg_from_name
-----------------------------------------------------
001     | test      | Mandela       | Super Admin
002     | test2     | Mandela       | Kristen

つまり、列の値に基づいて結合SQLクエリを取得します。


編集:

サーバーサイドコーディングからではなく、SQLクエリからデータをフェッチしたい。

ここからこのクエリを試しました。つまり、Winfredのアイデア(回答済み)

しかし、理解できませんでした。

msg_by_usertypeは列ベースであり、値managerは選択する必要manager_tableがあり、管理者の場合はadmin_table

4

3 に答える 3

5

私があなたの質問を理解している限り、あなたはこれを試すことができます:

    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  

これがどのように機能するかを確認するためのSQLフィドルです。(これは、マネージャーのように同じIDを持つ管理者がいない場合にのみ機能します。IDは両方のテーブルで一意である必要があります。)

于 2012-09-13T09:51:41.450 に答える
3

以下の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 
于 2012-09-13T10:48:40.933 に答える
2

私があなたの質問を正しく理解しているなら、あなたはこのような結果が欲しいですか?

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 
于 2012-09-13T10:52:17.553 に答える