我认为从根本上来说,我不明白如何使用相关表将两个表连接在一起,我需要帮助。
表值大致表示如下:
形成选项列表
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
我知道从根本上来说,我想要实现的目标是可能的。但我不知道如何到达那里。非常感谢任何帮助。
使用
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