I'm querying a database using knex, and I need the results to be ordered in a specific way. Currently, I have the following code which returns all the results I want, albeit in a haphazard order.
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()
I want it to order each whereLike query alphabetically, and then essentially concatenate the three whereLike queries together.
E.g.
AtoZ: whereLike("FruitTag", `${query}%`)
AtoZ: orWhereLike("FruitName", `${query}%`)
AtoZ: orWhereLike("FruitTag", `%${query}%`)
I tried reordering the orderBy but it seems to still return the results in not the order I want
EDIT 1: Given the following table below:
FruitTag | FruitName | FruitDescription |
---|---|---|
firetruck2 | ppbineapple | wherelike2 satisfies |
ppaa123 | apple | wherelike1 satisfies |
bhousepp | tyler | wherelike3 satisfies |
fipptruck | ppaineapple | wherelike2 satisfies |
ahousepp | james | wherelike3 satisfies |
ppab123 | ppapple | wherelike1 satisfies |
When I execute the query with ${query} as "pp", it should return in the following order:
FruitTag | FruitName | FruitDescription |
---|---|---|
ppaa123 | aapple | wherelike1 satisfies |
ppab123 | ppaapple | wherelike1 satisfies |
fipptruck | ppaineapple | wherelike2 satisfies |
firetruck2 | ppbineapple | wherelike2 satisfies |
ahousepp | james | wherelike3 satisfies |
bhousepp | tyler | wherelike3 satisfies |
You can notice that it first orders the results by the whereLike condition, then alphabatically based on conditions (e.g. wherelike1 will orderBy FruitTag, wherelike2 will orderBy FruitName, wherelike3 orderBy FruitTag
EDIT 2: Using the current suggested answer (credits to @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()
I get the result:
FruitTag | FruitName | FruitDescription |
---|---|---|
ppaa123 | ppaapple | wherelike1 satisfies |
ppaa123 | abpple | wherelike1 satisfies |
ppaa123 | aapple | wherelike1 satisfies |
fipptruck | ppaineapple | wherelike2 satisfies |
firetruck2 | ppbineapple | wherelike2 satisfies |
ahousepp | jbames | wherelike3 satisfies |
ahousepp | jaames | wherelike3 satisfies |
bhousepp | tyler | wherelike3 satisfies |
Is there a way to additionally order each orderByRaw by FruitName alphabatically again to get the following result?
FruitTag | FruitName | FruitDescription |
---|---|---|
ppaa123 | aapple | wherelike1 satisfies |
ppaa123 | abpple | wherelike1 satisfies |
ppaa123 | ppaapple | wherelike1 satisfies |
fipptruck | ppaineapple | wherelike2 satisfies |
firetruck2 | ppbineapple | wherelike2 satisfies |
ahousepp | jaames | wherelike3 satisfies |
ahousepp | jbames | wherelike3 satisfies |
bhousepp | tyler | wherelike3 satisfies |
EDIT 3: Using the current suggested answer (credits to @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()
Expected result
FruitTag | FruitName | FruitDescription |
---|---|---|
ppaa123 | aapple | wherelike1 satisfies |
ppaa123 | abpple | wherelike1 satisfies |
ppaa123 | ppaapple | wherelike1 satisfies |
fipptruck | ppaineapple | wherelike2 satisfies |
firetruck2 | ppbineapple | wherelike2 satisfies |
ahousepp | jaames | wherelike3 satisfies |
ahousepp | jbames | wherelike3 satisfies |
bhousepp | tyler | wherelike3 satisfies |
Actual result
FruitTag | FruitName | FruitDescription |
---|---|---|
ppaa123 | aapple | wherelike1 satisfies |
ppaa123 | abpple | wherelike1 satisfies |
ppaa123 | ppaapple | wherelike1 satisfies |
ahousepp | jaames | wherelike3 satisfies |
ahousepp | jbames | wherelike3 satisfies |
bhousepp | tyler | wherelike3 satisfies |
fipptruck | ppaineapple | wherelike2 satisfies |
firetruck2 | ppbineapple | wherelike2 satisfies |
Although now the FruitName is indeed additionally sorted, using this code apparently switched the order of orderByRaw(wherelike2) and orderByRaw(wherelike3) which messes up everything again
EDIT 4: Code used:
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()
Raw 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"
Expected Table
FruitTag | FruitName | FruitDescription |
---|---|---|
ppaa123 | aapple | wherelike1 satisfies |
ppaa123 | abpple | wherelike1 satisfies |
ppaa123 | ppaapple | wherelike1 satisfies |
fipptruck | ppaineapple | wherelike2 satisfies |
firetruck2 | ppbineapple | wherelike2 satisfies |
ahousepp | jaames | wherelike3 satisfies |
ahousepp | jbames | wherelike3 satisfies |
bhousepp | tyler | wherelike3 satisfies |
Actual Table
FruitTag | FruitName | FruitDescription |
---|---|---|
ppaa123 | ppaapple | wherelike1 satisfies |
ppaa123 | abpple | wherelike1 satisfies |
ppaa123 | aapple | wherelike1 satisfies |
bhousepp | tyler | wherelike3 satisfies |
ahousepp | jbames | wherelike3 satisfies |
ahousepp | jaames | wherelike3 satisfies |
firetruck2 | ppbineapple | wherelike2 satisfies |
fipptruck | ppaineapple | wherelike2 satisfies |
EDIT 5: Almost perfect again, it's the same code and problem as EDIT 3, but this time I've added the rawSQL for easy troubleshooting
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()
Raw 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"
Expected result
FruitTag | FruitName | FruitDescription |
---|---|---|
ppaa123 | aapple | wherelike1 satisfies |
ppaa123 | abpple | wherelike1 satisfies |
ppaa123 | ppaapple | wherelike1 satisfies |
fipptruck | ppaineapple | wherelike2 satisfies |
firetruck2 | ppbineapple | wherelike2 satisfies |
ahousepp | jaames | wherelike3 satisfies |
ahousepp | jbames | wherelike3 satisfies |
bhousepp | tyler | wherelike3 satisfies |
Actual result
FruitTag | FruitName | FruitDescription |
---|---|---|
ppaa123 | aapple | wherelike1 satisfies |
ppaa123 | abpple | wherelike1 satisfies |
ppaa123 | ppaapple | wherelike1 satisfies |
ahousepp | jaames | wherelike3 satisfies |
ahousepp | jbames | wherelike3 satisfies |
bhousepp | tyler | wherelike3 satisfies |
fipptruck | ppaineapple | wherelike2 satisfies |
firetruck2 | ppbineapple | wherelike2 satisfies |
This code apparently switched the orderByRaw(wherelike2) results and orderByRaw(wherelike3) results