SQLite中多列反向排序实现:price表排序需求问询
问题分析与解决
首先明确:SQLite完全支持你需要的多条件排序规则,你的问题出在ORDER BY子句的方向设置错误,并且缺少了opinions的排序条件。
原查询的问题
你给出的排序语句是:
order by score asc, price desc;
这和你的需求完全相悖:
- 你需要
score从大到小,却用了asc(升序,从小到大),应该改为desc(降序); - 你需要
price从小到大,却用了desc(降序,从大到小),应该改为asc; - 完全漏掉了
opinions从大到小的排序条件,这会导致同score的行无法按照评论数优先级排序。
符合你描述需求的正确SQL
按照你指定的score从大到小 → opinions从大到小 → price从小到大优先级,正确的查询语句是:
select score, opinions, shop.name, price from price left join shop on shop.id = price.shop order by score desc, opinions desc, price asc;
匹配你期望首行的调整方案
不过看你的示例数据,如果你期望首行是5.0 | fotopanorama.pl | 9099.0,那上面的语句可能不会得到这个结果——因为在所有score=5.0的行里,allegro.pl的opinions(47139)是最大的,会排在最前面。
如果你的实际需求是优先按score降序,然后price升序,最后opinions降序(这样fotopanorama.pl的最低价格会让它排在5.0分组的第一位),那对应的SQL应该是:
select score, opinions, shop.name, price from price left join shop on shop.id = price.shop order by score desc, price asc, opinions desc;
用你的示例数据测试这条语句,score=5.0的行里,price最低的fotopanorama.pl(9099.0)会成为结果的首行,完全符合你的期望。
内容的提问来源于stack exchange,提问作者jcubic
相关产品推荐
相关产品推荐

