我有如下表格。
表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
表资源_A
id |r_val| id_b
1 | ra1 | 1
表资源_
id |r_val| id_b
1 | rb1 | 2
表资源_C
id |r_val| id_b
1 | rc1 | 3
2 | rc2 | 4
如果表resource_type
中的B
为1,则表格B
与表格Resource_A
建立关联。
如果表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 :(得分: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
在这里演示: