如何在mysql中进行嵌套选择查询

如何在mysql中进行嵌套选择查询,mysql,sql,Mysql,Sql,我有一个如下表,它彼此连接,就像 Info_Table -> RoomGuests_Table -> ChildAge_Table 这些是表格 Info_Table +---------------------------+ | ID | Name | Rooms | +---------------------------+ | INFO1 | ABC | 2 | | INFO2 | DEF |

我有一个如下表,它彼此连接,就像

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   |
+-----------------------+   
我想要这样的结果

如果Info_表的
ID='INFO1'
那么结果应该是这样显示的

                                    Result                              
+-----------------------------------------------------------------------------------------------+   
|   ID      | Name  | Rooms |                           RoomGuests                              |
+-----------------------------------------------------------------------------------------------+   
|   INFO1   |   ABC |   2   | [{"NoOfAdults" : "2", "NoOfChild" : "2", "ChildAge" : "[4,5]"},   |
|           |       |       |  {"NoOfAdults" : "3", "NoOfChild" : "", "ChildAge" : "[]"}]       |
+-----------------------------------------------------------------------------------------------+   
所有的结果都应该是这样的

                                    Result                              
+-----------------------------------------------------------------------------------------------+   
|   ID      | Name  | Rooms |                           RoomGuests                              |
+-----------------------------------------------------------------------------------------------+
|   INFO1   |   ABC |   2   | [{"NoOfAdults" : "2", "NoOfChild" : "2", "ChildAge" : "[4,5]"},   |
|           |       |       |  {"NoOfAdults" : "3", "NoOfChild" : "", "ChildAge" : "[]"}]       |
|           |       |       |                                                                   |
|   INFO2   |   DEF |   1   | [{"NoOfAdults" : "2", "NoOfChild" : "1", "ChildAge" : "[2]"}]     |
|           |       |       |                                                                   |
|   INFO3   |   GHI |   3   | [{"NoOfAdults" : "2", "NoOfChild" : "1", "ChildAge" : "[7]"},     |
|           |       |       |  {"NoOfAdults" : "2", "NoOfChild" : "2", "ChildAge" : "[1,5]"},   |
|           |       |       |  {"NoOfAdults" : "2", "NoOfChild" : "1", "ChildAge" : "[3]"}]     |
+-----------------------------------------------------------------------------------------------+
我尝试了下面的代码,但不起作用。我无法理解如何做

SELECT 
    S.`ID`, A.`Name`, A.`Rooms`, 
    CONCAT(
        '[',
            GROUP_CONCAT( 
                CONCAT(
                    '{
                        \"NoOfAdults\":\"', R.Adults,'\",
                        \"NoOfChild\":\"', R.Child,'\",
                        \"ChildAge\":
                            \"', 
                                CONCAT( 
                                    '[', 
                                        GROUP_CONCAT( 
                                            CONCAT('{',C.Age,'}')
                                        ), 
                                    ']'
                                ),
                            ,'\",
                    }'
                ) 
            ),
        ']'
    ) AS RoomGuests, 
FROM `Info_Table` AS I
LEFT JOIN `RoomGuests_Table` AS R ON R.`R_ID` = A.`ID`
LEFT JOIN `ChildAge_Table` AS C ON C.`R_ID` = R.`R_ID`
GROUP BY A.R_ID;

或者有没有最好的方法制作这样的阵列请告诉我

Array
(
    [ID] => INFO1
    [Name] => ABC
    [Rooms] => 2
    [RoomGuests] => Array
        (
            [0] => Array
                (
                    [NoOfAdults] => 2
                    [NoOfChild] => 2
                    [ChildAge] => Array
                        (
                            [0] => 4
                            [1] => 5
                        )

                )

            [1] => Array
                (
                    [NoOfAdults] => 3
                    [NoOfChild] => 0
                    [ChildAge] => Array
                        (
                        )

                )

        )

)

尽管我认为SGBD不应该参与数据的修饰,但您需要分两步来完成

首先,您需要执行一个group_concat来聚合子表数据。 然后,您将能够使用RoomGuests\u表和第一次查询的结果执行主组\u concat

如果您尝试只使用一个组进行一次查询,您将有重复的数据

例如:

SELECT ...
FROM info_table it
left outer join RoomGuests_Table rt on it.ID = rt.R_ID
left outer join 
 ( SELECT ct.R_ID AS RG_ID, GROUP_CONCAT(ct.Age SEPARATOR ',') as concat_age
 FROM ChildAge_Table as ct
 GROUP BY ct.R_ID) tmp on tmp.RG_ID = rt.ID
GROUP BY ....
希望这有帮助

select i.name,i.rooms , group_concat(jsonres separator ',') from  Info_Table i right join ( select r.r_id, CONCAT('[{"NoOfAdults":"', Adult,'","NoOfChild":"', Child,'","ChildAge":[',group_concat(C.Age separator ','),']"}')   jsonres from test.RoomGuests_Table r left join test.ChildAge_Table  c on r.ID=c.R_ID group by c.R_ID)  as r on i.id= r.r_id group by i.name,i.rooms;
试着用这个

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\":', 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
        GROUP BY RG_ID
    ) RG ON RG.RG_ID = i.ID
WHERE i.ID = INFO1;

为什么你想用sql构建json格式?我已经编辑了帖子,请检查是否有其他方法忘记所有的CONCAT/GROUP\u CONCAT内容。只需返回一个有序数组并处理应用程序代码中的其余问题,因此您希望我为此使用一个循环是的,您是对的,我正在获取重复数据,因此如何做到这一点,请给我一个示例或一些链接,我仍在搜索我的答案,以提供最小的示例结构