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

bra*_*ter 7 mysql sql sql-order-by

我有一个搜索查询,它根据输入参数生成结果集,结果可以根据不同的参数进行排序(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"
Run Code Online (Sandbox Code Playgroud)

假设完整的结果集是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"
Run Code Online (Sandbox Code Playgroud)

我猜测为什么这不起作用:在order by子句之后,结果集按降序排序,然后在10条记录中截断.id = 14的记录可能不是此截断集的一部分.它是否正确 ?

如何获得id = 14的记录以保持在顶部?

Pet*_*ang 16

ORDER BY (p.id=14) DESC, (p.mPrice=p.vPrice) DESC
Run Code Online (Sandbox Code Playgroud)

p.id=141如果条件为真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
Run Code Online (Sandbox Code Playgroud)

我发现这比阅读更容易阅读UNION,并且可能表现更好.