2015-12-23 66 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