2017-02-27 67 views
0

我有三個表Mysql的加入基於列的值三個表

的USR

ID Name 
-------- 
1 Mark Dav 
2 Dan Fos 

卡斯特

ID Name 
-------- 
1 Jane Cue 
2 Mary Tie 

封郵件

ID Frm_ID To_ID Msg frm_cat to_cat 
-------- 
1  1  1  hello usr  cus 
1  1  2  There usr  cus 
1  2  1  hello cus  usr 
1  2  2  hello cus  usr 

如何加入表,因此我可以得到以下結果。

封郵件

ID Frm_ID To_ID Frm_name To_name Msg frm_cat to_cat 
------------------------------------------------ 
1  1  1  Mark Dav Jane Cue hello usr  cus 
1  1  2  Mark Dav Mary Tie There usr  cus 
1  2  1  Mark Tie Mark Dav hello cus  usr 
1  2  2  Mark Tie Dan Fos hello cus  usr 

我嘗試

id as id, 
    m.frm_id, 
    m.to_id, 
    m.msg, 
    f.name frm_name, 
    t.name to_name, 
from msgs m 
    left join usrs on f.id = m.from_id AND m.from_cat = 'usr' OR cust f on f.id = m.frm_id AND m.from_cat = 'cus' 
    left join usrs t on t.id = m.to_id AND m.from_cat = 'usr' OR cust f on f.id = m.fom_id AND m.from_cat = 'cus'; 

,但我得到了一系列的錯誤

+1

優選地,表應該分享鍵,以便您可以加入他們的表格並獲得正確和有意義的結果。 如何將表信息連接到cust表以及它如何連接到usrs表? – MaD

+0

cust和用戶連接到基於from_id和to_id的消息 – Smith

+0

如果msgs表上的Frm_ID是usrs表ID列的外鍵。然後你可以這樣做: select * from msgs left join usrs on(msgs.Frm_ID = usrs.ID); – MaD

回答

0

你可以使用一個union all子查詢堆棧usrscust在一起,然後用from_catto_cat字段來決定要加入的值。不幸的是,MySQL不支持熱膨脹係數,所以除非你想創建這樣的觀點,你可以只使用相同union all查詢兩次,每一次加盟:

SELECT m.id, frm_id, to_id, msg, frm_name, to_name, frm_cat, to_cat 
FROM msgs m 
JOIN (SELECT id, name AS frm_name, 'usr' AS cat 
     FROM usrs 
     UNION ALL 
     SELECT id, name AS frm_name, 'cus' AS cat 
     FROM cust) f ON m.frm_id = f.id AND f.frm_cat = f.cat 
JOIN (SELECT id, name AS to_name, 'usr' AS cat 
     FROM usrs 
     UNION ALL 
     SELECT id, name AS to_name, 'cus' AS cat 
     FROM cust) f ON m.to_id = f.id AND t.to_cat = f.cat