我在数据库( SQLite 3.21.0 )上做了一些测试,看来我的解决方案有效,但是我担心它只是运气,在某些情况下可能会失败,我想知道我的解决方案是否有效...
似乎GROUP_CONCAT()
使用主键,或者如果没有主键,它将尝试查找数字列并将其用于串联顺序,因此我想检查一下理论并决定使用{{ 1}}子句生成“新”表,这样,我将设置WITH
必须使用的顺序
这是我的工作:(简化查询)
GROUP_CONCAT
WITH data AS (SELECT cID,
pType || ':' || pID || ':' || pTotal || ':' ||
(CASE WHEN pDate IS NULL OR pDate = '' THEN '0' ELSE pDate END) fees
FROM Pay2015 AS A WHERE cID = A.cID AND pType > 1 ORDER BY pType)
SELECT A.cID, GROUP_CONCAT(data.fees, '|') fees FROM Pay2015 AS A
LEFT OUTER JOIN data ON A.cID = data.cID
WHERE A.cID = 98 AND pType = 0
数据将具有第一列的表作为cID,每行将是98,它将用于连接,WITH
也将必须使用因为它是唯一的数字列,而GROUP_CONCAT
会设置我需要的行顺序
现在,主查询将在此新表( data )上执行ORDER BY
,并且由于 data.cID 对于每一行都是相同的,它将对其进行连接就这样
为了进行比较,这里是有顺序问题的常规查询:
GROUP_CONCAT
这是按pType排序时的结果:(为简单起见,我使用 | 进行了分割,删除了除pType之外的所有列)
如您所见,结果顺序与常规查询中的pID顺序相同
你怎么看?
答案 0 :(得分:0)
group_concat()
的实现以数据库碰巧读取行的任何顺序处理行。
执行顺序的唯一方法是从实际上具有指定顺序的子查询(或视图或CTE)中读取行:
SELECT ... group_concat(...) ... FROM (SELECT ... ORDER BY ...);
请注意,子查询必须是FROM子句中唯一的数据源。如果将其与任何其他表连接,则该连接可能导致数据库以其他顺序读取行。如果需要加入,则必须在子查询中完成。