如何确保记录始终存在mysql给定的结果集中在顶部?
技术问答
106 人阅读
|
0 人回复
|
2023-09-13
|
我有一个搜索查询,根据输入参数生成结果集,可以根据不同的参数对结果进行排序(ASC / DESC):价格、持续时间等(分页到位,最多记录10条)1 a' [! @( ?5 B" F
如果我现在有一个要求的话id我希望相应的记录在给定结果集中的顶部保持粘性。0 c E6 a7 M G
假设我们有这样一个包表:, }! _4 n9 X+ t* ]
Package - id - name - mPrice - vPrice - duration// Searching pkg based on Price (in DESC order) where name = ThailandsqlQuery = "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的记录总是在顶部。我提出了以下查询,但不起作用:5 F9 k' w" I c3 f7 ?, G4 ^
sqlQuery = "SELECT p.id,p.name,p.mPrice,p.vPrice FROM package p WHERE p.name = LOWER('Thailand') or p.id = 14ORDER BY CASE WHEN p.id=14 then 0 else (p.mPrice p.vPrice) end DESC LIMIT 10"我猜测它为什么不起作用:在order by结果集按降序排序,然后在10个记录处被截断。id = 14的记录可能不属于截断集。对吗 ?
) Z- }+ ?( K5 v如何获得ID = 14的记录停留在顶部?3 Z/ L% H1 I4 F/ Q; D" @1 x
& ^6 `9 j" e0 u) ?4 M- M 解决方案: ' E7 M3 d8 G* Z/ E1 K# e6 c2 z, ^
ORDER BY (p.id=14) DESC,(p.mPrice=p.vPrice) DESCp.id=14``1如果条件为true,0则返回,否则,降序排列将所需带到顶部。
9 d7 k |! U2 x: j e1 E% u, Z数字从比较中返回MySQL您可以使用标准功能SQL编写:
- c% k4 C0 b/ L4 V! R' m" m# ~( s" L0 ZORDER BY CASE WHEN (p.id=14) THEN 0 ELSE 1 END, CASE WHEN (p.mPrice=p.vPrice) THEN 0 ELSE 1 END我发现它比阅读更容易UNION,而且可能会更好。 |
|
|
|
|
|