在SQLite中使用GROUP_CONCAT函数内的ORDER BY子句

问题描述 投票:5回答:4

我不认为我可以在ORDER BY函数中使用GROUP_CONCAT子句。

有没有人知道在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来自同一张桌子但不同的栏目:我想用Group1保留Group2的顺序:

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

所以,如果qazxsw poi看起来像这样qazxsw poi qazxsw poi应该像这样Group1

sql sqlite group-concat
4个回答
8
投票

SQLite不支持2,1,3中的Group2,但实际上你可以伪造它:

B,A,C

然后,您需要在代码中拆分结果,以便返回您的排序和值。


1
投票

为了避免任何不确定性,你可以像这样使用递归CTE:

ORDER BY

虽然非常复杂,但这种解决方案可确保正确的分类,并且可以通过更多列轻松扩展。排序列可以有间隙 - GROUP_CONCAT CTE负责将其制作成正确的整数序列。

请注意,GROUP_CONCAT(list_order || ':' || value) 可能需要一个最新版本的sqlite,它支持窗口函数。


0
投票

这样的事情怎么样?

sqlite> create table t3(pos,col1,col2);
sqlite> insert into t3 values(1,2,'B'),(2,1,'A'),(3,5,'E');
sqlite> select * from t3;
1|2|B
2|1|A
3|5|E
sqlite>
with
  sorted(pos,c1,c2) as (
    select row_number() over (order by t3.pos), -- sorting by first column's value
      t3.col1, t3.col2
      from t3
  ),
  concat(pos,c1,c2) as (
    select sorted.pos,sorted.c1,sorted.c2  -- starting with values for first position
      from sorted
     where sorted.pos=1
     union all
    select sorted.pos,
           concat.c1||','||sorted.c1,  -- adding next value from col1
           concat.c2||','||sorted.c2   -- adding next value from col2
      from concat
      join sorted
        on concat.pos+1 = sorted.pos   -- going through subsequent positions
  )
select c1, c2
  from concat
 order by pos desc
 limit 1;  -- order by desc limit 1 means 'take the row with largest number'

2,1,5|B,A,E

我没有测试过,但如果你可以共享一些数据......


-3
投票

我已经尝试了这个并且它完成了工作

sorted
© www.soinside.com 2019 - 2024. All rights reserved.