2017-02-10 72 views
1

我有如下的表格。使用Laravel或PHP在MySQL表上建立條件關係

表A

id | val_a 
1 | a1 
2 | a2 
3 | a3 

表B

id | id_a| val_b | resource_type 
1 | 2 | b1 | 1 
2 | 2 | b2 | 2 
3 | 3 | b3 | 3 
4 | 3 | b4 | 3 

表Resource_A

id |r_val| id_b 
1 | ra1 | 1 

表Resource_B

id |r_val| id_b 
1 | rb1 | 2 

表Resource_C

id |r_val| id_b 
1 | rc1 | 3 
2 | rc2 | 4 

如果resource_type是表B 1,然後用表Resource_AB化妝關係。

如果resource_type在表B中爲2,則表B與表Resource_B有關。

如果resource_type在表B中爲3,則表B與表Resource_C有關係。

所需的輸出是:

id_b | id_a| val_b |val_a | resource_type| r_val 
1 | 2 | b1 | a1 | 1   | ra1 
2 | 2 | b2 | a2 | 2   | rb1 
3 | 3 | b3 | a3 | 3   | rc1 
4 | 3 | b4 | a3 | 3   | rc2 

但是,什麼是得到它沒有使用laravel循環最好的方法是什麼?

如何通過使用Laravel 5.2或Laravel 4或PHP或MYSQL查詢來實現此目的?

謝謝。

+0

我認爲你必須在你的預期產出輕微錯字。'val_a'不應該有'a1'的值,因爲它的相應'id_a'值永遠不會出現在B表中。 –

回答

0

您只需將表格連接在一起,如下所示。這裏棘手的部分是從三個資源表中引入正確的r_val

COALESCE(t1.r_val, t2.r_val, t3.r_val) AS r_val 

這將需要從資源表的第一個非NULL值,按順序從左到右:我們可以通過左側的接合部每個資源表,然後使用下面的表達式來獲取匹配值做到這一點。假設tableb中的每個ID只出現一次,在其中一個資源表中,COALESCE()內的條款順序應該沒有關係。

SELECT tb.id AS id_b, 
     tb.id_a, 
     tb.val_b, 
     COALESCE(ta.val_a, 'NA') AS val_a, 
     tb.resource_type, 
     COALESCE(t1.r_val, t2.r_val, t3.r_val) AS r_val 
FROM tableb tb 
LEFT JOIN tablea ta 
    ON tb.id_a = ta.id 
LEFT JOIN resource_a t1 
    ON tb.id = t1.id_b 
LEFT JOIN resource_b t2 
    ON tb.id = t2.id_b 
LEFT JOIN resource_c t3 
    ON tb.id = t3.id_b 

演示在這裏:

SQLFiddle

+0

謝謝@Tim Biegeleisen –