如何在mysql中使用左连接的条件

Use*_*798 6 mysql sql

我有下面的表,它们彼此相连

Info_Table -> RoomGuests_Table -> ChildAge_Table
Run Code Online (Sandbox Code Playgroud)

这些是表格

        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   |
+-----------------------+   
Run Code Online (Sandbox Code Playgroud)

我想要这样的结果

如果Info_Table的ID = 'INFO3'; 那么结果应该像这样显示.

                                    Result                              
+-----------------------------------------------------------------------------------------------+   
|   ID      | Name  | Rooms |                           RoomGuests                              |
+-----------------------------------------------------------------------------------------------+   
|   INFO3   |   GHI |   3   | [{ "NoOfAdults":"2", "NoOfChild":"1", "ChildAge":[7] },           |
|           |       |       |  { "NoOfAdults":"2", "NoOfChild":"2", "ChildAge":[1,5] },         |
|           |       |       |  { "NoOfAdults":"2", "NoOfChild":"1", "ChildAge":[3] }]           |
+-----------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我试过下面的代码和工作.

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';
Run Code Online (Sandbox Code Playgroud)

但在以下情况下不起作用

IF记录如下

        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   |
+-----------------------+   
Run Code Online (Sandbox Code Playgroud)

正如你所看到RoomGuests_TableRG4已经没有孩子意味着它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] }]           |
+-----------------------------------------------------------------------------------------------+   
Run Code Online (Sandbox Code Playgroud)

但显示是这样的

                                    Result                              
+-----------------------------------------------------------------------------------------------+   
|   ID      | Name  | Rooms |                           RoomGuests                              |
+-----------------------------------------------------------------------------------------------+   
|   INFO3   |   GHI |   3   | [{ "NoOfAdults":"2", "NoOfChild":"2", "ChildAge":[1,5] },         |
|           |       |       |  { "NoOfAdults":"2", "NoOfChild":"1", "ChildAge":[3] }]           |
+-----------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

ChildAge_Table有没有记录RG4所以如何我的愿望结果,或者有没有什么办法来检查是否CA.ChildAge= null然后放在那里'[]'

pil*_*row 1

CA.ChildAge尝试用这样的方式保护它IFNULL

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

问题是C.ChildAge'RG4' 不存在(您知道),因此 LEFT JOINed 为RoomGuests_TableNULL CA.ChildAge。这个 NULL 也会使内部为CONCAT('{...}')NULL,但NULL 会被 过滤掉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;
Run Code Online (Sandbox Code Playgroud)