Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:将唯一列分组到自己的结果数组中_Php_Mysql_Sql_Database - Fatal编程技术网

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
        }
    ]
}
  • 上述输出是否可以通过MySQL查询实现,或者是否需要查询后数据操作(即循环)
  • 如果上述输出是可能的,那么执行查询后操作会更快更有效吗?(假设有数千行。)

  • 正如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
    是拼图中缺失的一块。干杯您不应将
    选择*
    分组依据
    一起使用。