2016-09-01 9 views
6

У меня есть ниже таблице, которая связана друг с другом, какКак использовать, если условие с левой присоединиться к MySQL

Info_Table -> RoomGuests_Table -> ChildAge_Table 

Эти таблицы

 Info_Table   
+---------------------------+ 
| ID  | Name | Rooms | 
+---------------------------+ 
| INFO1 | ABC | 2 | 
| INFO2 | DEF | 1 | 
| INFO3 | GHI | 3 | 
+---------------------------+ 


      RoomGuests_Table  
+-----------------------------------+ 
| ID | R_ID | Adult | Child | 
+-----------------------------------+ 
| RG1 | INFO1 | 2 | 2 | 
| RG2 | INFO1 | 3 | 0 | 
| RG3 | INFO2 | 2 | 1 | 
| RG4 | INFO3 | 2 | 1 | 
| RG5 | INFO3 | 2 | 2 | 
| RG6 | INFO3 | 2 | 1 | 
+-----------------------------------+ 


     ChildAge_Table       
+-----------------------+ 
| ID | R_ID | Age | 
+-----------------------+ 
| CA1 | RG1 | 4 | 
| CA2 | RG1 | 5 | 
| CA3 | RG3 | 2 | 
| CA4 | RG4 | 7 | 
| CA5 | RG5 | 1 | 
| CA6 | RG5 | 5 | 
| CA7 | RG6 | 3 | 
+-----------------------+ 

I Want Результат например

Если Info_Table's ID = 'INFO3'; Тогда результат должен быть показан следующим образом.

Я пробовал под кодом и работает.

SELECT i.ID, i.name,i.rooms, RG.RoomGuests 
FROM Info_Table i 
LEFT JOIN (
    SELECT 
     R.ID, R.R_ID AS RG_ID,  
     CONCAT(
      '[', 
       GROUP_CONCAT( 
        CONCAT(
         '{ 
          \"NoOfAdults\":\"', Adult,'\", 
          \"NoOfChild\":\"', Child,'\", 
          \"ChildAge\":', CA.ChildAge,' 
         }' 
        ) 
       ), 
      ']' 
     ) AS RoomGuests 

    FROM RoomGuests_Table R 

    LEFT JOIN (
     SELECT 
      C.R_ID AS CA_ID, 
      CONCAT(
       '[', 
        GROUP_CONCAT(Age SEPARATOR ','), 
       ']' 
      ) AS ChildAge 
     FROM ChildAge_Table C 
     GROUP BY CA_ID 
    ) CA ON CA.CA_ID = R.ID) 

    GROUP BY RG_ID 

) RG ON RG.RG_ID = i.ID 
WHERE i.ID = 'INFO3'; 

но ниже условия не работает

Если запись как этот

 Info_Table   
+---------------------------+ 
| ID  | Name | Rooms | 
+---------------------------+ 
| INFO3 | GHI | 3 | 
+---------------------------+ 


      RoomGuests_Table  
+-----------------------------------+ 
| ID | R_ID | Adult | Child | 
+-----------------------------------+ 
| RG4 | INFO3 | 2 | 0 | 
| RG5 | INFO3 | 2 | 2 | 
| RG6 | INFO3 | 2 | 1 | 
+-----------------------------------+ 


     ChildAge_Table       
+-----------------------+ 
| ID | R_ID | Age | 
+-----------------------+ 
| CA5 | RG5 | 1 | 
| CA6 | RG5 | 5 | 
| CA7 | RG6 | 3 | 
+-----------------------+ 

Как вы можете видеть RoomGuests_Table «s RG4 не имеет ребенка означает, что она имеет 0 значение так в это условие должно показать результат, подобный этому

       Result        
+-----------------------------------------------------------------------------------------------+ 
| ID  | Name | Rooms |       RoomGuests        | 
+-----------------------------------------------------------------------------------------------+ 
| INFO3 | GHI | 3 | [{ "NoOfAdults":"2", "NoOfChild":"0", "ChildAge":[] },   | 
|   |  |  | { "NoOfAdults":"2", "NoOfChild":"2", "ChildAge":[1,5] },   | 
|   |  |  | { "NoOfAdults":"2", "NoOfChild":"1", "ChildAge":[3] }]   | 
+-----------------------------------------------------------------------------------------------+ 

Но показывает, как этот

        Result        
+-----------------------------------------------------------------------------------------------+ 
| ID  | Name | Rooms |       RoomGuests        | 
+-----------------------------------------------------------------------------------------------+ 
| INFO3 | GHI | 3 | [{ "NoOfAdults":"2", "NoOfChild":"2", "ChildAge":[1,5] },   | 
|   |  |  | { "NoOfAdults":"2", "NoOfChild":"1", "ChildAge":[3] }]   | 
+-----------------------------------------------------------------------------------------------+ 

ChildAge_Table не имеет никаких записей RG4 так как мой результат желания или есть ли способ проверить, если CA.ChildAge = null затем положить туда '[]'

+0

прецедент, когда null, затем добавьте [] еще ваш код. – Pirate

+1

Если ID Info_Table = 'INFO3', разве имя не должно быть «GHI»? – jophab

+0

@Pirate, как это сделать, я попробовал это 'IF (CA.ChildAge = NULL, '[]', CA.ChildAge)' – User97798

ответ

1

Попробуйте защитить это CA.ChildAge с помощью IFNULL примерно так:

...CONCAT(
      '{\"NoOfAdults\":\"', Adult,'\", 
      \"NoOfChild\":\"', Child,'\", 
      \"ChildAge\":',  IFNULL(CA.ChildAge, '[]'),'}' 
     )... 

Проблема заключается в том, что C.ChildAge отсутствует для «RG4» (который вы знаете), и, таким образом, ЛЕВЫЙ присоединенные к RoomGuests_Table как NULL CA.ChildAge. Этот NULL делает внутренний CONCAT('{...}') NULL, но NULLs are filtered out by GROUP_CONCAT, то есть внешний CONCAT('[...]') не увидит его.

Вот полный, работая SQL:

SELECT i.ID, i.name,i.rooms, RG.RoomGuests 
    FROM Info_Table i 
LEFT JOIN ( SELECT R.ID, R.R_ID AS RG_ID,  
        CONCAT('[', 
          GROUP_CONCAT(CONCAT('{\"NoOfAdults\":\"', Adult,'\",\n', 
               '\"NoOfChild\":\"', Child,'\",\n', 
               '\"ChildAge\":',  IFNULL(CA.ChildAge, '[]'),'}')), 
          ']') 
         AS RoomGuests 
       FROM RoomGuests_Table R 
      LEFT JOIN ( SELECT C.R_ID AS CA_ID, 
           CONCAT('[', 
             GROUP_CONCAT(Age SEPARATOR ','), 
             ']') AS ChildAge 
          FROM ChildAge_Table C 
         GROUP BY CA_ID) CA 
        ON CA.CA_ID = R.ID) RG 
     ON RG.RG_ID = i.ID 
    WHERE i.ID = 'INFO3' 
GROUP BY RG_ID; 
+0

хорошо сделано, это вам очень помогает – User97798

+0

Я пробовал это, поэтому не работает 'IF (CA.ChildAge = NULL, '[]', CA.ChildAge)', – User97798

+0

@ User97798, NULL и оператор = не делают то, что вы хотите. Поиск на этом сайте для получения дополнительной информации. – pilcrow

0

два подхода; Я не проверял ни один:

План A: Используйте круглые скобки, чтобы сказать, как

FROM ... LEFT JOIN (... LEFT JOIN ...) 

или

FROM (... LEFT JOIN ...) LEFT JOIN ... 

(я не знаю, какой путь по умолчанию, я подозреваю, что по умолчанию причиняет вам неприятности

Plan B: Избавьтесь от второго левого соединения. Замените CA.ChildAge на SELECT, который составляет второе соединение. (Обязательно сравните вложите его.)

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