小编典典

如何确保一条记录始终在mysql中给定的结果集中位于顶部?

sql

我有一个搜索查询,该查询根据输入参数生成结果集,并且可以根据不同的参数对结果进行排序(ASC / DESC):价格,持续时间等(分页到位,最多10条记录)

我现在有一个要求,如果我有一个id传递,我希望相应的记录在给定结果集中的顶部保持粘性。

假设我们有一个这样的包表:

Package
 - id
 - name
 - mPrice
 - vPrice
 - duration

// Searching pkg based on Price (in DESC order) where name = Thailand
sqlQuery = 
"SELECT p.id, p.name, p.mPrice, p.vPrice FROM package p 
WHERE p.name = LOWER('Thailand') 
ORDER BY (p.mPrice + p.vPrice) DESC 
LIMIT 10"

假设完整的结果集是20条ID为1到20的记录,现在我需要返回ID 14的记录总是在最上面。我提出了以下查询,但这不起作用:

sqlQuery = 
"SELECT p.id, p.name, p.mPrice, p.vPrice FROM package p 
WHERE p.name = LOWER('Thailand') or p.id = 14
ORDER BY CASE 
WHEN p.id=14 then 0 
else (p.mPrice + p.vPrice) 
end DESC 
LIMIT 10"

我对为什么它不起作用的猜测:在order by子句之后,结果集按降序排序,然后在10条记录处被截断。id = 14的记录可能不属于该截断集。这样对吗 ?

如何获得ID = 14的记录停留在顶部?


阅读 212

收藏
2021-04-22

共1个答案

小编典典

ORDER BY (p.id=14) DESC, (p.mPrice=p.vPrice) DESC

p.id=14``1如果条件为true,0则返回,否则,则降序排列将所需的行带到顶部。

从比较中返回数字是MySQL的一项功能,您可以使用标准SQL编写:

ORDER BY CASE WHEN (p.id=14) THEN 0 ELSE 1 END,
         CASE WHEN (p.mPrice=p.vPrice) THEN 0 ELSE 1 END

我发现它比起来更容易阅读UNION,并且可能会更好。

2021-04-22