【发布时间】:2020-09-26 11:30:26
【问题描述】:
我正在尝试以 JSON 格式获取查询结果。 我的想法是在每个类别中获取菜单的所有项目 我需要的 JSON 是这样的:
{
"menu": {
"category": [
{
"id": 1,
"description": "Category 1 Description",
"items" : [
{
"id" : 1,
"item_name" : "Item name 1",
"price": 200
},
{
"id": 2,
"item_name" : "Item name 1",
"price": 200
}
]
},
{
"id": 2,
"description": "Category 1 Description",
"items": [
{
"id": 1,
"item_name" : "Item name 1",
"price": 200
},
{
"id": 2,
"item_name" : "Item name 1",
"price": 200
},
{
"id": 3,
"item_name" : "Item name 1",
"price": 200
}
]
}
]
}
}
SQL 小提琴图片:SQL Fiddle 我实际得到的表:
-- ----------------------------
-- Table structure for menu_category
-- ----------------------------
DROP TABLE IF EXISTS `menu_category`;
CREATE TABLE `menu_category` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
`image` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for menu_items
-- ----------------------------
DROP TABLE IF EXISTS `menu_items`;
CREATE TABLE `menu_items` (
`id` int NOT NULL AUTO_INCREMENT,
`id_category` int DEFAULT NULL,
`item_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`small_description` varchar(255) DEFAULT NULL,
`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`price` decimal(10,2) DEFAULT NULL,
`rating` decimal(10,2) DEFAULT NULL,
`image` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
我已经尝试了几个查询,但没有成功。 如何编写查询以获取与我发布的 JSON 一样的 JSON? 提前致谢!
【问题讨论】:
-
你不能在查询中这样做,你必须在代码本身中转换它
-
SELECT JSON_ARRAYAGG(JSON_OBJECT('menu', JSON_ARRAY('id', menu_category.id, 'description', menu_category.description, JSON_ARRAY('items', menu_items.item_name)))) from menu_category INNER JOIN menu_items ON menu_category.id = menu_items.id_category GROUP BY menu_category.id 我试过类似的方法
-
最终结果仍然是一个数组
-
如果您可以在 SQL fiddle 中提供,那么提供解决方案将很容易
-
我在帖子中添加了 SQL Fiddle Scheme