使用 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

如果表 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

在这里演示:

SQLFiddle

相关内容

  • 没有找到相关文章

最新更新