2017-08-26 22 views
1

我有一个subscriptions表,其中用户可以订阅多个类别。比方说,我在这个表中的以下数据:MySQL:将独特的列组合到自己的结果数组中

表结构和数据:

 
+-------------------+-----------+---------------+ 
| subscription_id | user_id | category_id | 
+-------------------+-----------+---------------+ 
| 1    | 40  | 123   | 
| 2    | 40  | 120   | 
| 3    | 40  | 119   | 
| 4    | 37  | 120   | 
| 5    | 37  | 119   | 
| 6    | 34  | 123   | 
+-------------------+-----------+---------------+ 

我试图通过user_id写一个MySQL查询将组的结果。下面是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可能,那么执行后查询操作会更快更有效吗? (假设有成千上万行)
+0

你可以''category_id'和subscription_id''group_concat'。 https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat – chris85

回答

0

正如chris85的评论,你可能会这样做。这可能工作也可能不会,但是当你看到它的结果也可能给你一些想法

select *, GROUP_CONCAT(category_id, ' ', subscription_id) from subscriptions GROUP BY user_id; 
+0

'subscription_id'将会因为这个答案而丢失,你需要group_concat两者。 – chris85

+0

您是否发现了这个 –

+0

'GROUP_CONCAT(subscription_id)'的一些想法 – chris85

0

我认为最好的答案会是第一个这样的USER_ID选择所有项目顺序:

SELECT user_id,subscription_id,category_id 
FROM subscriptions as s 
ORDER BY user_id 

而且使用循环将列表转换为指令列表,并且每个字典都有一个键(user_id)。

因为所有相同的user_id的项目将并排放置在列表中,所以只需要O(n)来完成此后处理。