我有一个搜索查询,该查询根据输入参数生成结果集,并且可以根据不同的参数对结果进行排序(ASC / DESC):价格,持续时间等(分页到位,最多10条记录)
我现在有一个要求,如果我有一个id传递,我希望相应的记录在给定结果集中的顶部保持粘性。
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的记录停留在顶部?
ORDER BY (p.id=14) DESC, (p.mPrice=p.vPrice) DESC
p.id=14``1如果条件为true,0则返回,否则,则降序排列将所需的行带到顶部。
p.id=14``1
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,并且可能会更好。
UNION