javascript 在SELECT语句中,ORDERBY对每个WHERE条件的作用是什么?

thtygnil  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(92)

我正在使用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)结果

vyswwuz2

vyswwuz21#

使用knex.raw()按比较表达式排序。

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}%`])
  .orderBy("FruitName")
  .distinct()

字符串
LIKE条件的值为true时为1,为false时为0,因此按条件DESC排序会将条件匹配的行放在第一位。

相关问题