使用Laravel或PHP在mysql表上建立条件关系

时间:2017-02-10 06:35:32

标签: php mysql laravel-5 laravel-4

我有如下表格。

表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查询实现此目的?

谢谢你。

1 个答案:

答案 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

在这里演示:

SQLFiddle