使用 Laravel 或 PHP 在 mysql 表上建立条件关系
Make conditional relation on mysql tables using Laravel or PHP
我有 table 如下所示。
Table一个
id | val_a
1 | a1
2 | a2
3 | a3
Table B
id | id_a| val_b | resource_type
1 | 2 | b1 | 1
2 | 2 | b2 | 2
3 | 3 | b3 | 3
4 | 3 | b4 | 3
Table Resource_A
id |r_val| id_b
1 | ra1 | 1
Table Resource_B
id |r_val| id_b
1 | rb1 | 2
Table Resource_C
id |r_val| id_b
1 | rc1 | 3
2 | rc2 | 4
如果resource_type
在TableB
中为1,则tableB
与tableResource_A
建立关系。
如果resource_type
是TableB
中的2,则tableB
与tableResource_B
建立关系。
如果resource_type
是TableB
中的3,则tableB
与tableResource_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 OR Laravel 4 OR PHP OR MYSQL 查询来实现?
提前致谢。
您只需像我在下面所做的那样将 table 连接在一起。这里棘手的部分是从三个资源 table 中引入正确的 r_val
。我们可以通过左连接到每个资源table,然后使用以下表达式来获取匹配值:
COALESCE(t1.r_val, t2.r_val, t3.r_val) AS r_val
这将从资源 table 中获取第一个非 NULL
值,顺序为从左到右。假设来自 tableb
的每个 ID 只出现一次,在其中一个资源 table 中,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
此处演示:
我有 table 如下所示。
Table一个
id | val_a
1 | a1
2 | a2
3 | a3
Table B
id | id_a| val_b | resource_type
1 | 2 | b1 | 1
2 | 2 | b2 | 2
3 | 3 | b3 | 3
4 | 3 | b4 | 3
Table Resource_A
id |r_val| id_b
1 | ra1 | 1
Table Resource_B
id |r_val| id_b
1 | rb1 | 2
Table Resource_C
id |r_val| id_b
1 | rc1 | 3
2 | rc2 | 4
如果resource_type
在TableB
中为1,则tableB
与tableResource_A
建立关系。
如果resource_type
是TableB
中的2,则tableB
与tableResource_B
建立关系。
如果resource_type
是TableB
中的3,则tableB
与tableResource_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 OR Laravel 4 OR PHP OR MYSQL 查询来实现?
提前致谢。
您只需像我在下面所做的那样将 table 连接在一起。这里棘手的部分是从三个资源 table 中引入正确的 r_val
。我们可以通过左连接到每个资源table,然后使用以下表达式来获取匹配值:
COALESCE(t1.r_val, t2.r_val, t3.r_val) AS r_val
这将从资源 table 中获取第一个非 NULL
值,顺序为从左到右。假设来自 tableb
的每个 ID 只出现一次,在其中一个资源 table 中,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
此处演示: