Comment puis-je grouper par un champ commencer par la valeur 0, par exemple.

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

Group by check_id by start par valeur 0 par groupe

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

Comment puis-je grouper?

1
Sleepwom 23 déc. 2015 à 13:09

3 réponses

Meilleure réponse

Eh bien, j'ai lu dans la question: grouper par un champ commence par la valeur 0

Ensuite, vous pouvez essayer ceci.

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

Cela regroupera tous les enregistrements commençant par 0 et triés par nom_utilisateur.

0
RubahMalam 23 déc. 2015 à 10:39

Cela vous donnera ce que vous voulez ... peut-être. Cela fonctionne mais repose sur le retour des enregistrements dans l'ordre approprié lorsqu'ils sont sélectionnés dans la table (et cela n'est PAS certain de se produire).

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

Il fonctionne en renvoyant les lignes et en utilisant des variables pour leur attribuer un regroupement (donc lorsque l'id devient plus petit, il en ajoute un à la valeur de regroupement), puis fait un GROUP BY sur le nom d'utilisateur et la valeur de regroupement.

Mais en réalité, vous devez avoir la valeur de regroupement stockée d'une manière ou d'une autre avec vos données à l'avance.

0
Kickstart 23 déc. 2015 à 10:33

À condition que id soit un champ auto-incrémenté , vous pouvez utiliser:

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

Les variables sont utilisées pour identifier des tranches d'enregistrements consécutifs, dans chaque partition user_name, en commençant par 0.

Démo ici

0
Giorgos Betsos 23 déc. 2015 à 10:36