Mysql 如何按字段值分组?

Mysql 如何按字段值分组?,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变小时,它会在分组值中添加一个),然后根据用户名和分组值进行分组 但实际上,您需要提前将分组值与数据一起存储。这

如何按一个字段分组,以值0开头 例如

按组检查\u id按组开始值0

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,隐式)用于操作“=”