我有一个机场表,每一行都包含以下字段:IATA、城市、国家...如何搜索所有这些字段,但首先返回完全匹配的结果?例如,如果我输入 ALB,我想看到第一个结果是 ALB、奥尔巴尼、美国,然后是所有其他匹配项,而不是之后的 TIA、地拉那、阿尔巴尼亚和奥尔巴尼?
这是我的代码:
const airports = await Airport.findAll({
attributes: [
'IATA',
'city',
'country',
],
where: {
[sequelize.Op.or]: [
{ IATA: filter.toUpperCase() },
{ city: { [sequelize.Op.like]: `%${filter}%` } },
{ country: { [sequelize.Op.like]: `%${filter}%` } },
],
status: 1,
},
});
最佳答案
我用这种方法解决了一个相关的问题。我在 order
上创建了一个列,如果 IATA
与 else 2
完全匹配,则返回 1 。订购此列将解决您的问题。
由于您的列可能不同并且使用 literal()
,您可以调整 order 属性,但概念是这样的。
const airports = await Airport.findAll({
attributes: [
'IATA',
'city',
'country',
],
where: {
[sequelize.Op.or]: [
{ IATA: filter.toUpperCase() },
{ city: { [sequelize.Op.like]: `%${filter}%` } },
{ country: { [sequelize.Op.like]: `%${filter}%` } },
],
status: 1,
},
order: {
[
sequelize.literal('CASE WHEN `IATA` like '%${filter}%' THEN 1 ELSE 2 END',
'desc'
],
['city', 'desc']
}
});
为了我的目的,我得到了 4 个
CASE
并且工作得很好。Obs:如果你的模型在
alias
列上有 IATA
,在这里,你需要输入你的原始列名,因为我们构建了一个字面术语。
关于mysql - 先按完全匹配顺序对 Op.or order 进行 Sequelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61956618/