2017-01-24 40 views
0

我想有结果是:获取元素的列表联接查询

“ID”:1, “技巧”:[{ “skill_name”: “产品设计 ” },{ “skill_name”: “图形 设计”}]

结果我是:

{ “ID”:1, “技巧”: “产品设计”},{ “id”:1,“技能”:“平面设计”}

我的查询是:

select `u`.`id`, `s`.`skill_name` as `skills` 
from `users` as `u` 
    left join `user_skills` as `s` on `u`.`id` = `s`.`user_id` 
where `u`.`id` = 1 

我试着GROUP BY user.id或SELECT DISTINCT,但没有运气。

如何获得每个ID的多个结果的数组?

+2

您必须使用应用程序代码将其格式化为JSON数组对象。但是,如果适合您使用的代码,您可以使用'GROUP_CONCAT(skill_name)'返回一个由'id'分隔的'skill'字符串以及'GROUP BY id'。SQL本身只会返回平坦的2D结果集。 –

+0

如果您需要帮助将SQL结果后处理成所需的JSON,请发布处理此查询的代码。 –

+0

这是查询的简化版本。 使用查询从7个表中使用连接获取大量信息。 (我使用knex作为查询生成器) 我试图找到解决方法是让“基本”查询,然后遍历结果“注入”技能列表 – Sequoya

回答

1
SELECT u.id, group_concat(s.skill_name) AS skills 
FROM users AS u 
LEFT JOIN user_skills AS s ON u.id = s.user_id 
WHERE u.id = 1 
GROUP BY u.id 

的出放为:

id skills 
-- ------------------------------ 
1 Product Design, Graphic Design 

如果你真的想要的输出格式如下:

{ “ID”:1, “技巧”:[{ “skill_name”:“Product Design”},{“skill_name”:“Graphic Design”}]}

然后试试这个SQL - (疯狂版):

SELECT 
    '{"id":', u.id, ', skills:[', 
    group_concat(concat('{"skill_name":"', s.skill_name, '"}')) AS skills, 
    ']}' 
FROM users AS u 
LEFT JOIN user_skills AS s ON u.id = s.user_id 
WHERE u.id = 1 
GROUP BY u.id 

SELECT的concat( '{ “ID”:',ID, '技能:['),GROUP_CONCAT(CONCAT( '{ “skill_name”: “',skill_name, '”}'))AS技能']'