Php MySQL:将唯一列分组到自己的结果数组中
我有一个Php MySQL:将唯一列分组到自己的结果数组中,php,mysql,sql,database,Php,Mysql,Sql,Database,我有一个subscriptions表,用户可以在其中订阅多个类别。假设我在这个表中有以下数据: 表格结构和数据: +-------------------+-----------+---------------+ | subscription_id | user_id | category_id | +-------------------+-----------+---------------+ | 1 | 40 | 123
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 |
+-------------------+-----------+---------------+
{
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
}
]
}
使用groupby user\u id
运行查询只返回唯一的行
两个问题:
+-------------------+-----------+---------------+
| subscription_id | user_id | category_id |
+-------------------+-----------+---------------+
| 1 | 40 | 123 |
| 2 | 40 | 120 |
| 3 | 40 | 119 |
| 4 | 37 | 120 |
| 5 | 37 | 119 |
| 6 | 34 | 123 |
+-------------------+-----------+---------------+
{
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
}
]
}
正如chris85所评论的,你可以这样做。这可能有效,也可能无效,但当你看到它的结果时,它可能会给你一些想法
select *, GROUP_CONCAT(category_id, ' ', subscription_id) from subscriptions GROUP BY user_id;
正如chris85所评论的,你可以这样做。这可能有效,也可能无效,但当你看到它的结果时,它可能会给你一些想法
select *, GROUP_CONCAT(category_id, ' ', subscription_id) from subscriptions GROUP BY user_id;
我认为最好的答案是首先按用户id选择所有项目订单,如下所示:
SELECT user_id,subscription_id,category_id
FROM subscriptions as s
ORDER BY user_id
并使用循环将列表转换为一个dict列表,每个dict都有一个键(用户id)
由于所有相同用户id的项目将并排放置在列表上,因此只需O(n)即可完成此后期处理。我认为最好的答案是首先按用户id顺序选择所有项目,如下所示:
SELECT user_id,subscription_id,category_id
FROM subscriptions as s
ORDER BY user_id
并使用循环将列表转换为一个dict列表,每个dict都有一个键(用户id)
因为所有相同用户id的项目将并排出现在列表上,所以只需O(n)即可完成此后期处理。您可以
group\u concat
类别id和subscription\u id
。您可以group\u concat
category\u id
和subscription\u id
subscription\u id
将丢失此答案,您需要同时对这两个问题进行分组。您是否从这个group\u concat(subscription\u id)
中找到了一些想法?谢谢@chris85和@Anil Shrestha,group\u concat
是拼图中缺失的部分。干杯你不应该使用select*
和groupby
subscription\u-id
这个答案会丢失,你需要将两者都分组。你从这个groupu-concat(subscription\u-id)
中找到一些想法了吗?谢谢@chris85和@Anil-Shrestha,groupu-concat
是拼图中缺失的一块。干杯您不应将选择*
与分组依据
一起使用。