MySQL:将唯一列分组到自己的结果数组中

时间:2017-08-26 15:34:08

标签: php mysql sql database

我有一个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运行查询仅返回唯一行。

两个问题:

  1. 上述输出是否可以通过MySQL查询或是否需要进行后查询数据操作(即循环)?
  2. 如果以上输出 IS 可能,那么执行查询后操作会更快更有效吗? (假设有数千行。)

2 个答案:

答案 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)来完成此后期处理。