2012-03-23 146 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 

我没有测试它,但如果你能分享一些数据...