将一个表中的行连接为不同表MYSQL中的一列

问题描述 投票:0回答:1

我认为从根本上来说,我不明白如何使用相关表将两个表连接在一起,我需要帮助。

  1. 我有一张名为“formoptionslist”的表,它有 3 列(id、名称、活动)
  2. 一个名为“formoptionslistformoptionsrelates”的关联表,它有 3 列(id、formoptionslist_id、formoptions_id)
  3. 最后是一个包含 3 列(id、名称、值)的“formoptions”表

表值大致表示如下:

形成选项列表

id |   name   | active
---------------------
1  | statuses | 1

表单选项列表表单选项相关

id | formoptionslist_id | formoptions_id
------------------------------------
1  | 1                  | 1    
2  | 1                  | 2   
3  | 1                  | 3

表格选项

id | name                   | value
------------------------------------
1  | Successfully Purchased | success    
2  | Shipping Error         | shipping_error   
3  | Failed Payment         | failed_payment

我正在尝试在一个查询中构建以下内容。

[{name: statues, 
     options:[
         {name: 'Successfully Purchased', value: 'success'},
         {name: 'Shipping Error, value: 'shipping_error'},
         {name: 'Failed Payment', value: 'failed_payment'}
     ]
}]

我使用php和PDO来查询mysql

我能够做的是生成类似的东西:

[{"options":"1,2,3,"}]

使用以下测试查询(此时我只是想了解 SQL,无需评论我如何不使用占位符等。

$this->db->select(
    'GROUP_CONCAT(DISTINCT formoptions_id) as options'.self::from.self::formoptionslistformoptionsrelates
        .self::leftJoin.self::formoptions
        .self::on
        .self::formoptionslistformoptionsrelates.'.formoptions_id'
        .self::equals.self::formoptionslistformoptionsrelates.'.formoptions_id'
    .self::where.'formoptionslist_id = 1'
    .' GROUP BY formoptionslist_id'
);

上面打印出以下内容:

SELECT GROUP_CONCAT(DISTINCT formoptions_id) as options 
FROM formoptionslistformoptionsrelates 
LEFT JOIN _formoptions ON formoptionslistformoptionsrelates.formoptions_id = formoptionslistformoptionsrelates.formoptions_id 
WHERE formoptionslist_id = 1 
GROUP BY formoptionslist_id

我知道从根本上来说,我想要实现的目标是可能的。但我不知道如何到达那里。非常感谢任何帮助。

php mysql pdo group-concat
1个回答
0
投票

使用

JSON_OBJECT
创建对象,并使用
JSON_ARRAYAGG()
将组内的值组合到数组中。

然后加入所有 3 个表。

SELECT JSON_OBJECT(
        'name', l.name,
        'options', JSON_ARRAYAGG(
            JSON_OBJECT(
                'name', o.name,
                'value', o.value
            )
        )
    ) AS result
FROM formoptionslist AS l
LEFT JOIN formoptionslistformoptionsrelates AS ol ON l.id = ol.formoptionslist_id
LEFT JOIN formoptions AS o ON o.id = formoptions_id
WHERE l.id = 1
GROUP BY l.id

演示

© www.soinside.com 2019 - 2024. All rights reserved.