0

好的,希望有人对此有一个优雅的解决方案。我一直在做两个查询,并认为它可以在一个查询中完成。

样本数据:

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...等子查询”

不必通过 PHP 整理重复结果(我使用的是 array_diff)也很好,另外它还可以在 URL 路由中进行非好的分页修复(偏移量减 2 等)。

此外,如果这是实现此内存/速度/其他方面的最佳方式,也请随意说!(虽然我怀疑它是)。

谢谢!

4

2 回答 2

1

您可以使用以下命令执行此操作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
于 2013-08-14T17:09:32.670 回答
0

只是为了在同一主题上有一个变化,你也可以使用IF(...)

SELECT * FROM data 
WHERE Area = 'AZ1' 
ORDER BY IF(AgentID = 15, 1, 2)
         Price DESC

如果您希望该行AgentID = 15出现在顶部并处于其“正常”位置,请尝试:

SELECT * FROM (
  SELECT *, 1 AS ord FROM data WHERE AgentID = 15 AND Area=AZ1
  UNION SELECT *, 2 AS ord FROM data WHERE Area=AZ1
) AS S
ORDER BY S.ord, S.Price DESC
于 2013-08-14T17:10:10.613 回答