mysql - 先按完全匹配顺序对 Op.or order 进行 Sequelize

标签 mysql sql database sequelize.js

我有一个机场表,每一行都包含以下字段: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/

相关文章:

php - 在 MySQL 中执行更新时,对重复键求和 `counts` 列

php - Web 应用程序 : Preprocess and send all items in one page load, 或将项目分成单独的客户端请求?

SQL 优化

php - 使用另一个表中的数据从下拉列表插入表

database - 如何使用Grails和多个Postgresql数据库架构

ios - 将一个数据库中的表复制到另一个数据库

php - Doctrine 2 结果缓存

sql - 如何修复 sql server 页面级损坏?

java - 将一个表中的数百万行与另一个表中的数百万行进行比较的最快方法

MySQL:获取表的最小值和最大值及其两个标题