0

我有以下 SQL 选择讨论论坛线程,并附带有关第一个/最后一个帖子、帖子数量和启动它的用户的信息:

SELECT forum_threads.*, 
       users.displayname as cc_username, 
       coalesce(count(forum_posts.id),0) AS cc_postCount,
       (select id from forum_posts where threadId=forum_threads.id order by tsCreate asc limit 1) as cc_firstPostId,
       (select id from forum_posts where threadId=forum_threads.id order by tsCreate desc limit 1) as cc_lastPostId,
       (select tsCreate from forum_posts where threadId=forum_threads.id order by tsCreate desc limit 1) as cc_tsLatest
FROM forum_threads
LEFT JOIN forum_posts ON forum_posts.threadId = forum_threads.id
LEFT JOIN users ON users.id = forum_threads.userId
GROUP BY forum_threads.id
ORDER BY forum_posts.tsCreate DESC

它似乎工作正常,但我刚刚在Tutorialspoint上读到SQLite 子查询不能包含ORDER BY. 我的做,他们工作。

他们是怎么工作的?我只是幸运吗,我应该以其他方式构造我的查询吗?

4

1 回答 1

1

您生成的子查询类型在 SQL中称为标量子查询。这是一个返回一列最多一行的子查询。例如,它计算单个值并且可以在selectandwhere子句中使用。

表达式的文档描述了标量子查询:

子查询表达式

. . .

返回单个列的子查询是标量子查询,并且可以在大多数地方使用。返回两列或更多列的子查询是行值子查询,只能用作比较运算符的操作数。

没有区别使用order by.

实际上,您的子查询类型实际上是标量相关子查询,但同样的推理也适用。

我应该注意到 SQLite 中表达式的语法图似乎缺少标量子查询。所以文档解释了它。我认为这是文档中的一个错误。

尽管您可以使用教程作为指导,但如果您真的想知道数据库的作用,请查看该数据库的文档。

于 2020-06-06T14:44:42.867 回答