我有如下表格。
表 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
如果表 B
中的 resource_type
为 1,则表B
与表 Resource_A
建立关系。
如果表 B
中的 resource_type
是 2,则表 B
与表 Resource_B
建立关系。
如果表 B
中的 resource_type
为 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 查询来实现这一点?
提前谢谢。
您只需要像我在下面所做的那样将表连接在一起。 这里的棘手部分是从三个资源表中引入正确的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
在这里演示: