我正在使用knex查询数据库,我需要以特定的方式对结果进行排序。目前,我有下面的代码,它返回我想要的所有结果,尽管顺序很随意。
knex("FRUITTBL")
.select("FruitTag", "FruitName", "FruitDescription")
.whereLike("FruitTag", `${query}%`)
.orWhereLike("FruitName", `${query}%`)
.orWhereLike("FruitTag", `%${query}%`)
.limit(20)
.offset(`${page}`)
.orderBy("FruitTag")
.orderBy("FruitName")
.orderBy("FruitTag")
.distinct()
字符串
我希望它按字母顺序排列每个whereLike查询,然后将三个whereLike查询连接在一起。
例如:
AtoZ: whereLike("FruitTag", `${query}%`)
AtoZ: orWhereLike("FruitName", `${query}%`)
AtoZ: orWhereLike("FruitTag", `%${query}%`)
型
我尝试重新排序orderBy,但它似乎仍然返回的结果在不是我想要的顺序
**编辑1:**鉴于下表:
| 水果名称|水果描述| FruitDescription |
| --|--| ------------ |
| 苹果|其中2满足| wherelike2 satisfies |
| 苹果|其中1满足| wherelike1 satisfies |
| 泰勒|其中3满足| wherelike3 satisfies |
| 番荔枝|其中2满足| wherelike2 satisfies |
| 詹姆斯|其中3满足| wherelike3 satisfies |
| 苹果|其中1满足| wherelike1 satisfies |
当我以${query}作为“pp”执行查询时,它应该按以下顺序返回:
| 水果名称|水果描述| FruitDescription |
| --|--| ------------ |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 苹果|其中1满足| wherelike1 satisfies |
| 番荔枝|其中2满足| wherelike2 satisfies |
| 苹果|其中2满足| wherelike2 satisfies |
| 詹姆斯|其中3满足| wherelike3 satisfies |
| 泰勒|其中3满足| wherelike3 satisfies |
您可以注意到,它首先按照whereLike条件对结果进行排序,然后根据条件(例如其中1将按FruitTag排序,其中2将按FruitName排序,其中3将按FruitTag排序
**编辑2:**使用当前建议的答案(归功于@Barmar):
knex("FRUITTBL")
.select("FruitTag", "FruitName", "FruitDescription")
.whereLike("FruitTag", `${query}%`)
.orWhereLike("FruitName", `${query}%`)
.orWhereLike("FruitTag", `%${query}%`)
.limit(20)
.offset(`${page}`)
.orderByRaw('FruitTag LIKE ? DESC', [`${query}%`]))
.orderByRaw('FruitName LIKE ? DESC', [`${query}%`]))
.orderByRaw('FruitTag LIKE ? DESC', [`%${query}%`]))
.distinct()
型
我得到的结果是:
| 水果名称|水果描述| FruitDescription |
| --|--| ------------ |
| 苹果|其中1满足| wherelike1 satisfies |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 番荔枝|其中2满足| wherelike2 satisfies |
| 苹果|其中2满足| wherelike2 satisfies |
| 詹姆斯|其中3满足| wherelike3 satisfies |
| 雅梅斯|其中3满足| wherelike3 satisfies |
| 泰勒|其中3满足| wherelike3 satisfies |
有没有一种方法可以按照FruitName的字母顺序对每个orderByRaw进行排序,以获得以下结果?
| 水果名称|水果描述| FruitDescription |
| --|--| ------------ |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 苹果|其中1满足| wherelike1 satisfies |
| 番荔枝|其中2满足| wherelike2 satisfies |
| 苹果|其中2满足| wherelike2 satisfies |
| 雅梅斯|其中3满足| wherelike3 satisfies |
| 詹姆斯|其中3满足| wherelike3 satisfies |
| 泰勒|其中3满足| wherelike3 satisfies |
**编辑3:**使用当前建议的答案(归功于@Barmar):
knex("FRUITTBL")
.select("FruitTag", "FruitName", "FruitDescription")
.whereLike("FruitTag", `${query}%`)
.orWhereLike("FruitName", `${query}%`)
.orWhereLike("FruitTag", `%${query}%`)
.limit(20)
.offset(`${page}`)
.orderByRaw('FruitTag LIKE ? DESC', [`${query}%`]))
.orderBy("FruitName")
.orderByRaw('FruitName LIKE ? DESC', [`${query}%`]))
.orderBy("FruitName")
.orderByRaw('FruitTag LIKE ? DESC', [`%${query}%`]))
.orderBy("FruitName")
.distinct()
型
预期结果
| 水果名称|水果描述| FruitDescription |
| --|--| ------------ |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 苹果|其中1满足| wherelike1 satisfies |
| 番荔枝|其中2满足| wherelike2 satisfies |
| 苹果|其中2满足| wherelike2 satisfies |
| 雅梅斯|其中3满足| wherelike3 satisfies |
| 詹姆斯|其中3满足| wherelike3 satisfies |
| 泰勒|其中3满足| wherelike3 satisfies |
实际结果
| 水果名称|水果描述| FruitDescription |
| --|--| ------------ |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 苹果|其中1满足| wherelike1 satisfies |
| 雅梅斯|其中3满足| wherelike3 satisfies |
| 詹姆斯|其中3满足| wherelike3 satisfies |
| 泰勒|其中3满足| wherelike3 satisfies |
| 番荔枝|其中2满足| wherelike2 satisfies |
| 苹果|其中2满足| wherelike2 satisfies |
虽然现在FruitName确实被额外排序了,但使用这段代码显然切换了orderByRaw(wherelike 2)和orderByRaw(wherelike 3)的顺序,这又把一切搞砸了
**编辑4:**使用的代码:
knex("FRUITTBL")
.select("FruitTag", "FruitName", "FruitDescription")
.whereLike("FruitTag", `${query}%`)
.orWhereLike("FruitName", `${query}%`)
.orWhereLike("FruitTag", `%${query}%`)
.limit(20)
.offset(`${page}`)
.orderByRaw('FruitTag LIKE ? DESC', [`${query}%`]))
.orderBy("FruitName")
.orderByRaw('FruitName LIKE ? DESC', [`${query}%`]))
.orderByRaw('FruitTag LIKE ? DESC', [`%${query}%`]))
.orderBy("FruitName")
.distinct()
型
原始SQL:
"select `FruitTag`, `FruitName`, `FruitDescription` from `FRUITTBL` where `FruitTag` like 'pp%' or `FruitName` like 'pp%' or `FruitTag` like '%pp%' order by FruitTag LIKE 'pp%' DESC, `FruitName` asc, FruitName LIKE 'pp%' DESC, FruitTag LIKE '%pp%' DESC, `FruitName` asc limit 20"
型
预期表
| 水果名称|水果描述| FruitDescription |
| --|--| ------------ |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 苹果|其中1满足| wherelike1 satisfies |
| 番荔枝|其中2满足| wherelike2 satisfies |
| 苹果|其中2满足| wherelike2 satisfies |
| 雅梅斯|其中3满足| wherelike3 satisfies |
| 詹姆斯|其中3满足| wherelike3 satisfies |
| 泰勒|其中3满足| wherelike3 satisfies |
实际表
| 水果名称|水果描述| FruitDescription |
| --|--| ------------ |
| 苹果|其中1满足| wherelike1 satisfies |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 泰勒|其中3满足| wherelike3 satisfies |
| 詹姆斯|其中3满足| wherelike3 satisfies |
| 雅梅斯|其中3满足| wherelike3 satisfies |
| 苹果|其中2满足| wherelike2 satisfies |
| 番荔枝|其中2满足| wherelike2 satisfies |
**EDIT 5:**几乎再次完美,它与EDIT 3的代码和问题相同,但这次我添加了rawSQL以便于故障排除
knex("FRUITTBL")
.select("FruitTag", "FruitName", "FruitDescription")
.whereLike("FruitTag", `${query}%`)
.orWhereLike("FruitName", `${query}%`)
.orWhereLike("FruitTag", `%${query}%`)
.limit(20)
.offset(`${page}`)
.orderByRaw('FruitTag LIKE ? DESC', [`${query}%`]))
.orderBy("FruitName")
.orderByRaw('FruitName LIKE ? DESC', [`${query}%`]))
.orderBy("FruitName")
.orderByRaw('FruitTag LIKE ? DESC', [`%${query}%`]))
.orderBy("FruitName")
.distinct()
型
原始SQL:
"select `FruitTag`, `FruitName`, `FruitDescription`
from `FRUITTBL`
where `FruitTag` like 'pp%' or `FruitName` like 'pp%' or `FruitTag` like '%pp%'
order by FruitTag LIKE 'pp%' DESC,
`FruitName` asc,
FruitName LIKE 'pp%' DESC,
`FruitName` asc,
FruitTag LIKE '%pp%' DESC,
`FruitName` asc
limit 20"
型
预期结果
| 水果名称|水果描述| FruitDescription |
| --|--| ------------ |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 苹果|其中1满足| wherelike1 satisfies |
| 番荔枝|其中2满足| wherelike2 satisfies |
| 苹果|其中2满足| wherelike2 satisfies |
| 雅梅斯|其中3满足| wherelike3 satisfies |
| 詹姆斯|其中3满足| wherelike3 satisfies |
| 泰勒|其中3满足| wherelike3 satisfies |
实际结果
| 水果名称|水果描述| FruitDescription |
| --|--| ------------ |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 阿普尔|其中1满足| wherelike1 satisfies |
| 苹果|其中1满足| wherelike1 satisfies |
| 雅梅斯|其中3满足| wherelike3 satisfies |
| 詹姆斯|其中3满足| wherelike3 satisfies |
| 泰勒|其中3满足| wherelike3 satisfies |
| 番荔枝|其中2满足| wherelike2 satisfies |
| 苹果|其中2满足| wherelike2 satisfies |
这段代码显然交换了orderByRaw(wherelike 2)结果和orderByRaw(wherelike 3)结果
1条答案
按热度按时间vyswwuz21#
使用
knex.raw()
按比较表达式排序。字符串
LIKE
条件的值为true时为1,为false时为0,因此按条件DESC排序会将条件匹配的行放在第一位。