Mysql 如何按字段值分组?
如何按一个字段分组,以值0开头 例如 按组检查\u id按组开始值0Mysql 如何按字段值分组?,mysql,Mysql,如何按一个字段分组,以值0开头 例如 按组检查\u id按组开始值0 user_name, check_info user_a, 0-1-2 user_a, 0-1-3 user_b, 0-1-3 我如何分组?这会给你想要的……也许吧。它确实可以工作,但依赖于从表中选择时以适当顺序返回的记录(这不一定会发生) 它的工作原理是返回行并使用变量为其分配分组(因此,当id变小时,它会在分组值中添加一个),然后根据用户名和分组值进行分组 但实际上,您需要提前将分组值与数据一起存储。这
user_name, check_info
user_a, 0-1-2
user_a, 0-1-3
user_b, 0-1-3
我如何分组?这会给你想要的……也许吧。它确实可以工作,但依赖于从表中选择时以适当顺序返回的记录(这不一定会发生) 它的工作原理是返回行并使用变量为其分配分组(因此,当id变小时,它会在分组值中添加一个),然后根据用户名和分组值进行分组
但实际上,您需要提前将分组值与数据一起存储。这将为您提供您想要的……也许。它确实可以工作,但依赖于从表中选择时以适当顺序返回的记录(这不一定会发生) 它的工作原理是返回行并使用变量为其分配分组(因此,当id变小时,它会在分组值中添加一个),然后根据用户名和分组值进行分组
但实际上,您需要提前将分组值与数据一起存储。如果
id
是一个自动递增字段,那么您可以使用:
SELECT user_name,
GROUP_CONCAT(check_id ORDER BY check_id SEPARATOR '-') AS check_info
FROM (
SELECT id, check_id, user_name,
@grp := IF (@uname = user_name,
IF (check_id = 0, @grp + 1, @grp),
IF (@uname := user_name, @grp + 1, @grp + 1)) AS grp
FROM mytable
CROSS JOIN (SELECT @grp := 0, @uname := '') AS vars
ORDER BY id) AS t
GROUP BY user_name, grp
变量用于标识每个user\u name
分区内的连续记录片,从0
开始
如果
id
是一个自动递增字段,则可以使用:
SELECT user_name,
GROUP_CONCAT(check_id ORDER BY check_id SEPARATOR '-') AS check_info
FROM (
SELECT id, check_id, user_name,
@grp := IF (@uname = user_name,
IF (check_id = 0, @grp + 1, @grp),
IF (@uname := user_name, @grp + 1, @grp + 1)) AS grp
FROM mytable
CROSS JOIN (SELECT @grp := 0, @uname := '') AS vars
ORDER BY id) AS t
GROUP BY user_name, grp
变量用于标识每个user\u name
分区内的连续记录片,从0
开始
我在问题中读到:按一个字段分组,以值0开头
那么,您可以试试这个。
select user_name,group_concat(distinct check_id order by check_id asc separator '-') check_info
from (
select id,check_id,user_name,
case when check_id = 0 then
@rn := @rn+1
else
@rn := @rn
end as unique_id
from t
inner join (select @rn := 0) as tmp
order by user_name
) as tbl
group by user_name,unique_id
这将为每个记录按0开始分组,并按用户名排序。好吧,我在问题中读到:按一个字段按值0开始分组
那么,您可以试试这个。
select user_name,group_concat(distinct check_id order by check_id asc separator '-') check_info
from (
select id,check_id,user_name,
case when check_id = 0 then
@rn := @rn+1
else
@rn := @rn
end as unique_id
from t
inner join (select @rn := 0) as tmp
order by user_name
) as tbl
group by user_name,unique_id
这将按0开始的每个记录分组,并按用户名排序。您的表设计使得为该记录编写查询变得非常困难。您有重复的行(例如,
1-0-用户a
重复)。你应该考虑改变表的结构。(我不能帮你,因为你没有给我们解释你的表上下文/数据要求)虽然基本思想是可能的,但最大的问题是你没有定义行的顺序(也就是说,行的顺序,以及用户_a在输出中出现两次的原因基本上是随机的-没有任何理由说明它们将以该顺序出现)@ RAHOUTOS不会产生预期的结果集。我敢打赌,没有基于您的示例数据产生预期结果集的查询。您的表设计使它很难编写一个查询。您有重复行(例如,代码>1—0 - UsReA A/CODE>)。您应该考虑改变表的结构。(我不能帮你,因为你没有给我们解释你的表上下文/数据要求)虽然基本思想是可能的,但最大的问题是你没有定义行的顺序(即,行的顺序,以及用户a在输出中出现两次的原因基本上是随机的-没有理由它们会以这种顺序出现)。@rahuts这不会产生预期的结果集。我打赌,没有查询会根据示例数据生成预期的结果集。[Err]1267-非法混合排序规则(utf8\u general\u ci,隐式)和(utf8_unicode_ci,隐式)用于操作“=”[Err]1267-非法混合排序规则(utf8_general_ci,隐式)和(utf8_unicode_ci,隐式)用于操作“=”