2012-09-13 18 views
5

¿Cómo puedo unir tablas usando el valor de columna?obtener la tabla unirse con el valor de columna

Tengo tres tablas que se enumeran a continuación:

  • 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 
    

¿Cómo puedo obtener la salida deseada como se muestra a continuación con consulta SQL. Es decir. tablas de unión con respecto a los valores de columna cuando se cumplen los siguientes criterios:

  1. Si user_type = admin entonces debería unirse con admin_table.

  2. Si user_type = manager entonces debe unir con manager_table.

salida deseada:

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

es decir, Obtenga la consulta join de SQL basada en el valor de la columna.


EDIT:

quiero ir a buscar la consulta SQL no datafrom formar la codificación serverside.

yo probamos este consulta desde here, es decir, la idea de Winfred (contestados)

Sin embargo, no podía entenderlo.

msg_by_usertype es la columna basada en que el valor manager entonces se debe seleccionar manager_table y si es admin el que admin_table

+0

¿cuáles son las columnas que desea recuperar? –

+0

Además, ¿cómo se relacionan las tablas entre sí? ejemplo, la tabla de mensajes y la tabla de administración? ¿cuál es su columna de enlace –

+0

He editado la pregunta, por favor eche un vistazo. – Rafee

Respuesta

5

Por lo que he entendido su pregunta, usted puede intentar esto:

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 

Aquí hay un SQL Fiddle para ver cómo funciona. (Sólo funciona si no se puede tener un administrador que tiene el mismo identificador como un gerente. Id debe ser único en ambas tablas.)

3

Utilice el siguiente 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 
2

si entiendo bien su pregunta , ¿quieres un resultado como este?

MSG_ID  MSG_BODY MSG_TO  BY   MSG_BY_USERTYPE 
---------- ---------- ---------- ----------- --------------- 
001   test  adm1  managone  manager   
002   sadff  adm1  adm3?  admin 

Si es así, usted podría utilizar este

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 
Cuestiones relacionadas