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,并且可能表现更好.