按用户id获取不同的值作为数组

4ngedf3f  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(513)

我想为每个用户获得一个不同值的列表,每个用户限制3个值:
id,用户id,值

1, 1, a
2, 1, b
3, 2, c
4, 1, b
5, 1, d
6, 1, e

预期结果:

user_id, values
1, [a,b,d]
2, [c]

有什么办法可以解决这个问题吗 GROUP BY user_id 以及 DISTINCT ?

2vuwiymt

2vuwiymt1#

编辑(基于评论):
我们可以使用用户定义的变量将行号分配给各种 value 在…的分区内 user_id . 最后,我们将过滤掉这个结果集,每个结果集最多考虑3行 user_id 只是。

SELECT 
  dt2.user_id, 
  dt2.value 
FROM 
(
  SELECT
    @rn := CASE WHEN @ui = dt.user_id THEN @rn + 1
                ELSE 1
           END AS row_no, 
    @ui = dt.user_id, 
    dt.value 
  FROM 
  (
    SELECT DISTINCT
      user_id, 
      value
    FROM your_table
    ORDER BY user_id 
  ) AS dt 
  CROSS JOIN (SELECT @rn := 0, @ui := null) AS user_init_vars 
) AS dt2 
WHERE dt2.row_no <= 3

上一个问题的答案: Group_Concat(Distinct...) 所有这些都是独一无二的 value 为了一个 user_id .
然后我们可以使用 Substring_Index() 函数将字符串设为第三个逗号。这将导致最多只考虑3个值。
最后,我们可以使用 Concat() 函数将结果字符串括在方括号中。 Values 是mysql中的保留关键字。您可以考虑将结果列命名为其他列。
请尝试以下操作:

SELECT user_id, 
       CONCAT('[', 
              SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT value), ',', 3), 
              ']') AS user_values 
FROM your_table
GROUP BY user_id

相关问题