Sql 在子查询中按降序排序?
我有一个SQL查询,它统计属于所有现有Sql 在子查询中按降序排序?,sql,postgresql,Sql,Postgresql,我有一个SQL查询,它统计属于所有现有轮询的所有轮询选项的所有投票。这很好,但现在我想实现分页,它首先返回最新的轮询。我试着这样做: SELECT offset_polls.id AS pollId, offset_polls.title, poll_options.id AS pollOptionId, text, vote_count FROM ( SELECT * FROM polls ORDER BY id DESC LIMIT 10 OFFSET 0 ) as offset_
轮询的所有轮询选项的所有投票。这很好,但现在我想实现分页,它首先返回最新的轮询。我试着这样做:
SELECT offset_polls.id AS pollId, offset_polls.title, poll_options.id AS pollOptionId, text, vote_count
FROM (
SELECT * FROM polls ORDER BY id DESC LIMIT 10 OFFSET 0
) as offset_polls
JOIN poll_options ON poll_options.poll_id = offset_polls.id
LEFT OUTER JOIN (
SELECT poll_option_id, COUNT(poll_option_id) as vote_count
FROM votes
GROUP BY poll_option_id
) as votesCount ON poll_options.id = votesCount.poll_option_id
ORDER BY offset_polls.id desc
问题是第一个子查询忽略ORDERBY-是的,我知道这样做是SQL标准。按照我的方式,没有返回任何行。如果在第一个子查询中不使用orderby
,则整个查询都是“预期的”,但是轮询
当然是从最早的查询返回到最新的查询。如何在SQL中解决这个问题?我可以获取所有行并在之后对它们进行分页,但我非常确定这将是低效的(在Node.js中工作)
编辑
上述查询按预期工作。“bug”在我的数据库种子文件中 我检查了您的示例数据,没有发现postgresql的行为有任何问题。当您运行查询时会发生什么
SELECT * FROM polls ORDER BY id DESC LIMIT 10 OFFSET 0
它返回具有以下id的所有轮询:20
,19
,18
,…,11
。然后,您使用poll\u options
连接这些行,但由于该范围内没有poll\u id
的行,因此将一无所获:
# SELECT * FROM poll_options WHERE poll_id BETWEEN 11 AND 20;
id | text | poll_id
----+------+---------
(0 rows)
如果从offset\u polls
子查询中删除ORDER BY
子句,那么它将包括10个“随机”行,其中可能有一些轮询选项,这就是查询返回一些行的原因。因此,在本例中,ORDER BY
不会被忽略,其行为完全符合您的预期。您能提供样本数据+当前结果与预期结果吗?@sstan这将是样本数据:。如前所述,当我运行上述查询时,得到0行。我希望它返回类似这样的内容:,只是它只返回10个(LIMIT 10
)最近的(ORDER BY id DESC
)民意测验及其选项和聚合投票。但是我不知道如何去做,除了在我的第一个子查询中使用orderby
过滤10个最近的民意测验。是的,谢谢。事实证明,当我在播种poll\u选项时,我只将它们添加到前10个轮询(1-10),因此当尝试获取轮询(11-20)时,当加入poll\u选项时,它们不会返回任何行。查询本身按预期工作。