好的,希望有人能为此提供一个优雅的解决方案。我已经在两个查询中完成了这一任务,并认为它可以在一个查询中完成。
示例数据:
ID、区域、AgentID、价格
1、AZ1、15、100
2、AZ1、16、110
3、AZ2、15、180
4、AZ1、12、109
5、AZ3、15、180
6、AZ1、11、90
7、AZ2、15、140
8、AZ1、10、110
9、AZ4、11、120
10、AZ1、12、130
该查询的基本思想是,我需要从区域为 AZ1 的数据中获取所有内容 (SELECT *),并按价格降序排序。非常基本:SELECT * FROM data WHERE Area=AZ1 ORDER BY Price DESC
但是,我需要先对 AgentID=15 的两个条目进行排序。我之前已经将其作为两个查询来执行:
SELECT * FROM data WHERE Area=AZ1 AND AgentID=15 ORDER BY Price DESC LIMIT 2
SELECT * FROM data WHERE Area=AZ1 ORDER BY Price DESC
并且首先显示第一个结果。这样做并不是什么大不了的事,但为了让事情变得时尚和性感,我可以将这些结合起来吗?当我尝试子查询时,它说“此版本的 MySQL 尚不支持 LIMIT...etc 子查询”
不必通过 PHP 整理重复结果(我使用的是 array_diff)也很好,而且它可以在 URL 路由中修复不太好的分页(偏移量负 2 等)。
此外,如果这是实现内存/速度/任何方面的最佳方法,也请随意说出来! (尽管我对此表示怀疑)。
谢谢!
最佳答案
您可以使用union all
来做到这一点:
select t.*
from ((SELECT *, ord = 1 FROM data WHERE Area=AZ1 AND AgentID=15 ORDER BY Price DESC LIMIT 2)
union all
(SELECT *, ord = 2 FROM data WHERE Area=AZ1 )
) t
order by ord, price desc
关于MySQL 按 X 排序,但先对 Y 中的两个进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237956/