2015-04-17 50 views
1

我有一個表,其看起來像這樣:拆分列到定義的範圍中MYSQL

+----------------------- 
| id  | first_name 
+----------------------- 
| AC0089 | John  | 
| AC0015 | Dan  | 
| AC0017 | Marry  | 
| AC0003 | Andy  | 
| AC0001 | Trent  | 
| AC0006 | Smith  | 
+----------------------- 

我需要一個查詢中的3至分裂ID,並且還顯示該範圍的起始ID即

+------------+----------+-------- 
| startrange | endrange | id     
+------------+----------+-------- 
|   1 |  3 | AC0089 
|   4 |  6 | AC0003 
+------------+----------+-------- 

我很新的SQL和嘗試下面的查詢,但我不認爲我接近正確的解決方案!以下是查詢:

select startrange, endrange, id from table inner join (select 1 startRange, 3 endrange union all select 4 startRange, 6 endRange) r group by r.startRange, r.endRange; 

它每次都給出相同的ID,我無法拿出任何其他解決方案。我如何獲得所需的輸出?

回答

1

試試這個

SET @ct := 0; 
select startrange,(startrange + 2) as endrange, seq_no from 
(select (c.st - (select count(*) from <table_name>)) as startrange, c.* from 
(select (@ct := @ct + 1) as st, b.* from <table_name> as b) c 
having startrange mod 3 = 1) as cc; 

對不起格式化。

+0

startrange mod 3 = 0正在返回結果(mod 3 = 1返回一個空集)。而且,開始範圍和結束範圍都顯示負值。就像150條記錄一樣,它是-150到-148。你可以請進一步看看和編輯你的答案? – ani0710

+0

爲我工作檢查http://sqlfiddle.com/#!2/8e4e4/1 –

+0

「select count(*)from 」查詢應該根據您的主要選擇標準。 –

0

我不完全確定你想要做什麼,但是如果你試圖將ID錶轉換成範圍,請使用大小寫。

CASE WHEN startrange in(1,2,3) THEN 1 
    ELSE NULL 
END as startrange, 

CASE WHEN endrange in(1,2,3) THEN 3 
    ELSE NULL 
END as endrange, 

CASE WHEN ID in(1,2,3) THEN id 
    WHEN ID in(4,5,6) THEN id 
    ELSE id 
END AS ID