在 SQLite 中,多个列的排序方式是不是与 group_concat 相同?

Posted

技术标签:

【中文标题】在 SQLite 中,多个列的排序方式是不是与 group_concat 相同?【英文标题】:In SQLite, will multiple colums order the same way with group_concat?在 SQLite 中,多个列的排序方式是否与 group_concat 相同? 【发布时间】:2017-11-26 16:10:06 【问题描述】:

我有一张这样的桌子:

title      id     name
manager.....1......bob
manager.....2......tim
manager.....3.....suzy
 worker.....4.....john

我正在查询:select title, group_concat(id), group_concat(name) group by title

我得到了结果:

manager......1,2,3......bob,tim,suzy   <-- id order and name order match
 worker..........4..............john

我的问题是,id 顺序和 name 顺序是否保证匹配? SQLite manual 说:“连接元素的顺序是任意的。”这是否意味着我冒着得到以下结果的风险:

manager......3,1,2......bob,tim,suzy   <-- id order doesn't match name order
 worker..........4..............john

我在测试中从未见过这种情况,但在投入生产之前我需要确定。

谢谢!

编辑:澄清一下,我根本不关心 特定 顺序。我只关心group_concat(id) 的顺序与group_concat(name) 的顺序相同。这是我的问题。

【问题讨论】:

Sqlite group_concat ordering的可能重复 【参考方案1】:

“任意”一词的意思是“任意”。

无论如何,group_concat() 将按照读取实际行的顺序累积值。所以如果你关心返回值,你应该在聚合之前对原始数据进行排序:

SELECT title, group_concat(id), group_concat(name)
FROM (SELECT title, id, name
      FROM ...
      ORDER BY title, id  -- or whatever order you want
     )
GROUP BY title;

理论上,SQLite 的未来版本可能会通过从索引中读取值或类似的方式来优化单个 group_concat() 调用。但因为这确实会改变行为,所以不太可能。在任何情况下,同一个 SQLite 版本的行为都不会改变。

【讨论】:

感谢您的回答。澄清一下,我根本不关心具体的顺序,我只关心group_concat(id) 的顺序与group_concat(name) 的顺序相同。在您的示例中,子查询是否仅适用于group_concat(name) 而不适用于group_concat(id)?是否保证id 的行顺序与name 的行顺序相同?

以上是关于在 SQLite 中,多个列的排序方式是不是与 group_concat 相同?的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 是不是创建一个我可以排序/获取的数字索引?

lag与lead函数 oracle_11g

SQLITE3 - 删除具有相同值的多个列的行

sqlite3:创建没有列的表

跨多个列的 SQL 联接

SQLite 在另一列的值上拆分列