2012-03-23 22 views
5

我不認爲我可以在GROUP_CONCAT函數中使用ORDER BY子句。在SQLite的GROUP_CONCAT函數中使用ORDER BY子句

有沒有人知道在SQLite中完成此行爲的一個棘手方法?

我以前看過這個question。但我有一個複雜的查詢。

我的發言是這樣的:

SELECT 
    c.col1, c.col3, m.col3, m.col4, 
    count(m.col1), count(re.col2) AS cnt, 
    GROUP_CONCAT(p.col1 ORDER BY p.col1) AS "Group1", 
    GROUP_CONCAT(p.col2 ORDER BY p.col1) AS "Group2", 
    GROUP_CONCAT(CASE WHEN con.col3 is null THEN p.col1 ELSE con.col3 END), 
    con.col4, con.col5, p.col3 
FROM t1 re 
    INNER JOIN t2 c ON (re.col1 = c.col1) 
    INNER JOIN t3 p ON (re.col2 = p.col1) 
    LEFT JOIN t4 con ON (con.col1 = p.col2) 
    INNER JOIN t5 m ON (m.col1 = c.col5) 
GROUP BY re.col1 

Group1Group2從相同的表,但不同的欄目來:我要保留Group1Group2的順序:

table t3 
+------+------+ 
| col1 | col2 | 
+------+------+ 
| 1 | A | 
| 2 | B | 
| 3 | C | 
| 4 | D | 
| 5 | E | 
+------+------+ 

所以如果Group1看起來像這樣2,1,3Group2應該看起來像這樣B,A,C

+1

你在你的答案寫在查詢做你所需要的。那麼問題是什麼? – newtover 2012-03-25 11:12:52

+0

@newtover他使用的語法是由mysql而不是sqlite支持的。 – chacham15 2014-07-01 19:10:56

回答

-3

我已經試過這一點,它使工作

SELECT 
    c.col1, c.col3, m.col3, m.col4, 
    count(m.col1), count(re.col2) AS cnt, 
    GROUP_CONCAT(p.col1 ORDER BY p.col1) AS "Group1", 
    GROUP_CONCAT(p.col2 ORDER BY p.col1) AS "Group2", 
    GROUP_CONCAT(CASE WHEN con.col3 is null THEN p.col1 ELSE con.col3 END), 
    con.col4, con.col5, p.col3 
FROM t1 re 
    INNER JOIN t2 c ON (re.col1 = c.col1) 
    INNER JOIN (
     SELECT col1, col2, col3, col4, col5 FROM t3 ORDER BY col1 
    ) AS   p ON (re.col2 = p.col1) 
    LEFT JOIN t4 con ON (con.col1 = p.col2) 
    INNER JOIN t5 m ON (m.col1 = c.col5) 
GROUP BY re.col1 
+0

SQLite真的支持'GROUP_CONCAT(column ORDER BY some_column)'語法嗎?對於我來說''ORDER'(SQLite 3.4.7) – zapl 2012-04-02 16:15:21

+0

不支持,但我的解決方案做的工作:) – confucius 2012-04-02 19:08:53

+3

這不適用於sqlite。它在ORDER上失敗像上面說的zapl – livinzlife 2013-02-20 00:03:36

8

SQLite不支持ORDER BY一個GROUP_CONCAT內,但實際上你可以僞造它:

GROUP_CONCAT(list_order || ':' || value) 

然後,你需要拆分導致代碼爲了得到您的種類和價值。

+0

你能詳細說一下嗎?我不明白你的答案。 – nowox 2017-04-27 15:05:41

+1

@nowox你不能用SQLite直接在GROUP_CONCAT裏面排序,所以這個命令會把list_order與分隔符(這裏我使用「:」)和值連接起來。然後,當解析結果時(對於我來說,我使用的是Android)將數據保存在列表中,然後根據list_order對其進行重新排序。 – Murphy 2017-04-27 19:59:11

0

這樣的事情呢?

SELECT 
    col1, col3, col3, col4, 
    count(col1), count(re.col2) AS cnt, 
    GROUP_CONCAT(p.col1) AS "Group1", 
    GROUP_CONCAT(p.col2) AS "Group2", 
    GROUP_CONCAT(CASE WHEN con.col3 is null THEN p.col1 ELSE con.col3 END), 
    con.col4, con.col5, p.col3 
FROM (
    SELECT 
     * 
    FROM t1 re 
     INNER JOIN t2 c ON (re.col1 = c.col1) 
     INNER JOIN t3 p ON (re.col2 = p.col1) 
     LEFT JOIN t4 con ON (con.col1 = p.col2) 
     INNER JOIN t5 m ON (m.col1 = c.col5) 
    ORDER BY 
     p.col1 ASC, 
     p.col2 ASC 
) 
GROUP BY re.col1 

我沒有測試它,但如果你能分享一些數據...