2012-03-27 51 views

回答

2

您將有一些標準添加到組的他們:

CREATE TABLE sample (integer foo, char(1) bar); 
INSERT INTO sample VALUES 
(1, 'a'), (2, 'a'), (3, 'a'), (4, 'b'), (5, 'b'), (6, 'b'), (7, 'c') ...; 

SELECT GROUP_CONCAT(foo ORDER BY foo, ',') 
FROM sample 
GROUP BY bar 

編輯:

試試這個:

select group_concat(foo) from (
    select s1.foo, (count(*) - 1)/3 grp from sample s1 
    join sample s2 on s1.rowid >= s2.rowid 
    group by s1.rowid 
) final 
group by grp 
+0

這是一個很好的選擇,我在這種情況下使用的實際數據不會有太大的變化,但如果一個被刪除,我將不得不實施一個邏輯單元來爲沒有三個成員並且不是最新的組包含新值。 但謝謝你的另一種觀點:) – 2012-03-27 03:50:00

+0

我又增加了一個答案。它應該在刪除時保留下來,因爲它是動態計算的 – 2012-03-27 04:16:02

+0

哇!太好了! :) 謝謝你,你保存了一天。 O / – 2012-03-27 04:21:31

0

這可能不是最好的解決辦法(並具有一定優勢的情況下---如果你有一個3值不爲空),並且大概可以放入一個查詢中,但我需要RowId加入。它應該做的伎倆,雖然:

CREATE TEMP TABLE split1 (foo1 int); 
CREATE TEMP TABLE split2 (foo2 int); 
CREATE TEMP TABLE split3 (foo3 int); 

INSERT INTO split1 
SELECT foo FROM sample WHERE foo % 3 = 1 ORDER BY foo 

INSERT INTO split2 
SELECT foo FROM sample WHERE foo % 3 = 2 ORDER BY foo 

INSERT INTO split3 
SELECT foo FROM sample WHERE foo % 3 = 0 ORDER BY foo 

SELECT 
    CASE 
     WHEN foo2 IS NULL THEN foo1 
     WHEN foo3 IS NULL THEN foo1||','||foo2 
     ELSE foo1||','||foo2||','||foo3 
    END 
FROM split1 
    LEFT JOIN split2 
     ON split1.RowId = split2.RowId 
    LEFT JOIN split3 
     ON split2.RowId = split3.RowId 
+0

@MostyMostacho好的,我認爲現在應該是好的。 – 2012-03-27 03:35:44

+0

我相信這種方式會更多perfomartico在代碼循環中實現這個邏輯。我可以下令簡化電話。 非常感謝你 有應該退出一個查詢「魔術」的線這個任務是不是? – 2012-03-27 03:54:24

+0

我不能在一個視圖:( – 2012-03-27 03:59:15

相關問題