我有一个subscriptions
表,用户可以订阅多个类别。我们假设我在此表中有以下数据:
表格结构和数据:
+-------------------+-----------+---------------+ | subscription_id | user_id | category_id | +-------------------+-----------+---------------+ | 1 | 40 | 123 | | 2 | 40 | 120 | | 3 | 40 | 119 | | 4 | 37 | 120 | | 5 | 37 | 119 | | 6 | 34 | 123 | +-------------------+-----------+---------------+
我试图编写一个MySQL查询,按user_id
对结果进行分组。下面是JSON中的一般说明(但输出格式并不重要;对于此示例,JSON在视觉上更容易阅读IMO。)
期望输出:
{
40: [
{
subscription_id: 1,
category_id: 123
},
{
subscription_id: 2,
category_id: 120
},
{
subscription_id: 3,
category_id: 119
}
],
37: [
{
subscription_id: 4,
category_id: 120
},
{
subscription_id: 5,
category_id: 119
}
],
34: [
{
subscription_id: 6,
category_id: 123
}
]
}
使用GROUP BY user_id
运行查询仅返回唯一行。
两个问题:
答案 0 :(得分:0)
正如chris85所评论,你可能会喜欢这样。这可能有用,也可能没有,但是当你看到它的结果时,它可能会给你一些想法
select *, GROUP_CONCAT(category_id, ' ', subscription_id) from subscriptions GROUP BY user_id;
答案 1 :(得分:0)
我认为最好的答案是首先按user_id选择所有项目顺序:
SELECT user_id,subscription_id,category_id
FROM subscriptions as s
ORDER BY user_id
使用循环将列表转换为 dicts列表,每个dict都有一个键(user_id)。
因为所有相同的user_id项目将并排放在列表中,所以只需要O(n)来完成此后期处理。