2013-05-31 24 views
0

我有一個表,如:MySQL的聯合行的條件

user | area | start | end 
1  1  12  18 
1  1  19  27 
1  1  29  55 
1  1  80  99 

表示:「用戶」在「區域」出現時,從「開始」時間「端」,區域可以重疊。

我想要的是得到這樣的結果:

user | start-end 
1  12-18,19-27,29-55 
1  80-99 

這意味着:結合與出現超過規定值的時間差較小,即(row2.start - row1.end < 10),和一個結果行代表用戶對該區域的「訪問」。 目前我可以通過使用一個sql語句比較同一表來區分每次訪問並獲得訪問次數。但我無法找到獲得上述結果的方法。 任何幫助表示讚賞。

說明:第3個出現作爲只有一個訪問鏈接在一起的,因爲:row2.start-row1.end < 10和row3.start-row2.end < 10,最後出現是一個新的訪問,因爲:80( row4.start) - 55(row3.end)> = 10。

+0

後你已經嘗試了什麼。你能再次解釋第二排是如何產生的嗎? – fancyPants

回答

1

我們需要兩個步驟:

1 - 結合一排它predcessor到具有相同的行

SELECT 
    user, area, start, end, @lastend AS lastend, @lastend:=end AS ignoreme 
FROM 
    tablename, 
    (SELECT @lastend:=0) AS init 
ORDER BY user, area, start, end; 

2在開始和最後的終點 - 用差作爲分組標準

SELECT 
    ... 
FROM 
    ... 
    (SELECT @groupnum:=0) AS groupinit 
GROUP BY 
    ... , 
    IF(start-lastend>=10,@groupnum:[email protected]+1,@groupnum) 

現在讓我們結合起來:

SELECT 
    user, area, 
    GROUP_CONCAT(CONCAT(start,"-",end)) AS start_end 
FROM (
    SELECT 
     user, area, start, end, @lastend AS lastend, @lastend:=end AS ignoreme 
    FROM 
     tablename, 
     (SELECT @lastend:=0) AS init 
    ORDER BY user, area, start, end 
) AS baseview, 
(SELECT @groupnum:=0) AS groupinit 
GROUP BY 
    user, area, 
    IF(start-lastend>=10,@groupnum:[email protected]+1,@groupnum) 

編輯

修正錯別字和驗證:SQLfiddle

+0

非常感謝,爲案件工作,你提供瞭解決方法 – imnobody