2015-12-23 63 views
1

我怎么可以由一个字段开始价值0 例如。我如何按字段值分组?

select * from t; 
id, check_id, user_name 
1, 0,  user_a 
2, 1,  user_a 
3, 2,  user_a 
1, 0,  user_a 
2, 1,  user_a 
3, 3,  user_a 
1, 0,  user_b 
2, 1,  user_b 
3, 3,  user_b 

组由开始check_id由每组值0

user_name, check_info 
user_a, 0-1-2 
user_a, 0-1-3 
user_b, 0-1-3 

我怎样才能按?

+4

您的表格设计使得编写查询非常困难。您有重复的行(例如'1 - 0 - user_a'重复)。你应该考虑改变表格的结构。 (我不能帮你,因为你没有给我们解释你的表格上下文/数据需求) –

+2

虽然基本思想是可能的,但最大的问题是你没有什么可以定义行的顺序(即,行的顺序,以及为什么user_a在您的输出中出现两次基本上是随机的 - 没有理由为什么它们会按顺序出现)。 – Kickstart

+0

@Rahautos这不会产生预期的结果集。 –

回答

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和秩序由USER_NAME这将组。

0

这会给你你想要的....也许。它确实有效,但依赖于从表格中选择时以适当的顺序返回的记录(并且不一定会发生)。

SELECT user_name, GROUP_CONCAT(check_id ORDER BY grouping, check_id SEPARATOR '-') 
FROM 
(
    SELECT id, check_id, user_name, @grouping:=if(id > @prev_id, @grouping, @grouping + 1) AS grouping, @prev_id:=id 
    FROM t 
    CROSS JOIN 
    (
     SELECT @grouping:=0, @prev_id:=0 
    ) sub0 
) sub1 
GROUP BY user_name, grouping 

它通过返回的行和使用变量分配分组到他们(因此当ID变小它增加了一个分组值),然后再执行GROUP BY上的用户名和分组值。

但实际上,您需要将分组值与预先存储的数据以某种方式存储在一起。

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_name分区中,通过0开始。

Demo here

+0

[错误] 1267 - 非法混合排序(utf8_general_ci,IMPLICIT)和(utf8_unicode_ci,IMPLICIT)进行操作'=' – Sleepwom