我希望SQL先显示/排序name
列的结果,然后最后显示description
列的结果。
当前的SQL查询:
SELECT * FROM products WHERE (name LIKE '%$search_query%' OR description LIKE '%$search_query%')
我尝试在最后添加order by name, description [ASC|DESC]
,但是没有用。
用于优化搜索结果。如果在description
中找到了某个单词,那么如果在name
列中也找到了某个单词,则应排在最后。
答案 0 :(得分:3)
您可以在{
"header":{
"messageId":"mysys_20181130163429809_00000001",
"businessId":"mysys_BookLevel_Daily_Regular_20181130_BOOK",
"batchId":"01_20181130_8271",
"sourceSystem":"mysys",
"secondarySourceSystem":null,
"sourceSystemCreationTimestamp":1532637269809,
"sentBy":"mysys",
"sentTo":"SA",
"messageType":"PnLMessage",
"schemaVersion":"1.11PnL-SNAPSHOT",
"processing":"RealTime",
"recordOffset":null
},
"pnlData":{
"pnlHeader":{
"granularity":"BookLevel",
"pnlType":"Daily",
"pnlSubType":"Regular,
"businessDate":"2018-11-30",
"bookId":"1234",
"bookDescription":"BOOK",
"pnlStatus":"Locked"
},
"pnlBreakDown":{
"category":null,
"subCategory":null,
"riskCategory":null,
"pnlCurrency":USD,
"pnlDetails":[
"pnlLocalAmount":100.46
"pnlCDEAmount":150.69
]
}
}
}
中使用CASE
语句来确定名称的优先级。在下面的示例中,名称匹配的所有结果都将排在第一位,因为ORDER BY
语句的计算结果为1,而所有其他结果的计算结果为2。
我不确定您的问题描述是什么,但您当然可以使用此技术来创建更精确的案例以对结果进行优先级排序。
CASE
答案 1 :(得分:0)
如果首先要使用名称,最简单的order by
是:
order by (name like '%$search_query%') desc
MySQL在数字上下文中将布尔值视为数字,其中“ 1”为true,“ 0”为false。
答案 2 :(得分:0)
尽管这没有记录,但是当结果集由UNION ALL
组合且之后未排序时,它们将保持返回顺序,因为UNION ALL只会将新结果添加到结果集的底部。这应该为您工作:
SELECT * FROM products
WHERE name LIKE '%$search_query%'
UNION ALL
SELECT * FROM products
WHERE (description LIKE '%$search_query%' AND name NOT LIKE '%$search_query%')