Your example is fundamentally flawed because you are not changing the order of
the data fed *into* group_concat. Although the documentation (which I am sure
someone will point you to) indicates that group_concat ordering is arbitrary,
it is not (it cannot be).
It concatenates the data fed into it, in the order that it is presented. This
may appear "arbitrary" to some, but it is not. Any sufficiently advanced
technology appears magical to the primitive observer. It is not possible for
the order to be arbitrary when the data is visited in row-wise fashion -- it is
only possible to be of limited understanding.
Consider your subselect:
> (select group_concat(chr)
> from b
> where oid = a.id
> group by oid
> order by chr
> )
The "group by" is meaningless, since the correlated subquery already only
projects the rows in a single group (determined by the where clause).
The "order by" is meaningless, since it applies to the order of the projected
results, which in this case is only one row (that is, it is applied AFTER
group_concat, not before). You statement after the meaningless cruft is
removed is equivalent to:
select a.id,
(select group_concat(chr)
from b
where oid = a.id
)
from a;
which should make the results you are seeing more understandable. The table b
is a b-tree indexed by the rowid. The table is scanned, and each of the rows
that passes the "where" clause is fed to the group_concat function. The
results are ordered by the rowid which is the default visitation order of the
rows in the table b. Baring programmatic diddling with the rowid, this is the
order in which the data was inserted into table b.
If you want to change the visitation order, you can either create an index with
the correct visitation order (index ob, below) or you can "feed the data" into
group concat in the order you wish it to be concatenated. There is no magic
here.
>sqlite
SQLite version 3.10.0 2016-01-04 23:43:47
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .read gc.sql
create table a(id integer not null, primary key(id));
create table b(oid integer not null, chr char null);
insert into a values(1);
insert into a values(2);
insert into b values(1,'y');
insert into b values(1,'x');
insert into b values(2,'x');
insert into b values(2,'y');
select a.id,
(select group_concat(c)
from (select chr as c
from b
where oid = a.id
order by chr)
)
from a;
1|x,y
2|x,y
create index ob on b (oid, chr);
select a.id,
(select group_concat(chr)
from b
where oid = a.id
)
from a;
1|x,y
2|x,y
> -Original Message-
> From: sqlite-users-bounces at mailinglists.sqlite.org [mailto:sqlite-users-
> bounces at mailinglists.sqlite.org] On Behalf Of Yuri
> Sent: Monday, 4 January, 2016 17:14
> To: General Discussion of SQLite Database
> Subject: [sqlite] 'order by' doesn't work with 'group_concat()'
>
> Please consider this example:
>
> ---begin---
> #!/bin/sh
>
> DB=sq.sqlite
> rm -f $DB
>
> sql() {
>echo "$1" | sqlite3 $DB
> }
>
> sql "create table a(id integer not null, primary key(id));"
> sql "create table b(oid integer not null, chr char null);"
> sql "insert into a values(1);"
> sql "insert into a values(2);"
> sql "insert into b values(1,'y');"
> sql "insert into b values(1,'x');"
> sql "insert into b values(2,'x');"
> sql "insert into b values(2,'y');"
>
> sql "select
> a.id,
> (select group_concat(chr)
> from b
> where oid = a.id
> group by oid
> order by chr
> )
> from
> a;"
> ---end---
>
> It returns this dataset:
> 1|y,x
> 2|x,y
>
> The 'order by' clause doesn't work, because if it did the result would
> have been:
> 1|x,y
> 2|x,y
>
> sqlite3-3.9.2
>
> Yuri
> ___
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users