2017-02-10 1 views
1

У меня есть таблицы, как показано ниже.Сделать условное отношение для таблиц mysql с использованием Laravel или PHP

Таблица 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 

Если resource_type 1 в таблице B, то таблица B делают связь с таблицей Resource_A.

Если resource_type - 2 в таблице B, то таблица B сделать отношение к таблице Resource_B.

Если resource_type - 3 в таблице B, то таблица 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 OR Laravel 4 OR PHP или MYSQL Query?

С благодарностью.

+0

Я думаю, что у вас есть небольшая опечатка в вашем ожидаемом результате.'val_a' никогда не должно иметь значения' a1', потому что его соответствующее значение 'id_a' никогда не появляется в таблице B. –

ответ

0

Вам нужно всего лишь присоединиться к столам вместе, как я сделал ниже. Трудная часть здесь приводит к правильному r_val из трех таблиц ресурсов. Мы можем сделать это с помощью левого присоединения к каждой таблице ресурсов, а затем, используя следующее выражение, чтобы захватить соответствующее значение:

COALESCE(t1.r_val, t2.r_val, t3.r_val) AS r_val 

Это будет принимать первое не NULL значение из таблицы ресурсов, в порядке слева направо , Предполагая, что каждый идентификатор от tableb появляется только один раз, в одной из таблиц ресурсов порядок терминов внутри 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

+0

Спасибо @Tim Biegeleisen –

Смежные вопросы