我想获取每个用户的不同值的列表,每个用户限制三个值:
id,user_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
来做到这一点?
答案 0 :(得分:0)
编辑(based on comments):
我们可以使用用户定义的变量将行号分配给value
分区中的各种user_id
。最终,我们将过滤掉该结果集,以使每个user_id
仅考虑3行。
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
是Reserved keyword in MySQL。您可以考虑将结果列命名为其他名称。请尝试以下操作:
SELECT user_id,
CONCAT('[',
SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT value), ',', 3),
']') AS user_values
FROM your_table
GROUP BY user_id