【问题标题】:MySQL - ORDER result based on how many ORs it matchMySQL - 基于它匹配多少 OR 的 ORDER 结果
【发布时间】:2021-02-08 03:22:00
【问题描述】:

数据库不是我的强项,我不确定我所寻找的东西是否存在。总的来说,我很乐意提供任何可以引导我走向正确道路的建议。

我有什么:

我有一个带有多个 OR 的查询,想象它像下面这样:
SELECT * FROM video WHERE video.name LIKE '%topspeed%' OR video.name LIKE '%%audi%';

假设这个查询的结果是:

+------------+---------------+
| id | name                  |
+------------+---------------+
|  1 | My best audi          |
|  2 | topspeed of mustang?  |
|  3 | audi A7 topspeed      |
|  4 | Do you like audi?     |
|  5 | topspeed of audi Q8   |
+------------+---------------+

我需要什么:

有没有办法根据匹配的 OR 数对结果进行排序? 所以换句话说,我希望原始示例的顺序是:
+------------+---------------+
| id | name                  |
+------------+---------------+
|  5 | topspeed of audi Q8   |
|  3 | audi A7 topspeed      |
|  1 | My best audi          |
|  2 | topspeed of mustang?  |
|  4 | Do you like audi?     |
+------------+---------------+

【问题讨论】:

    标签: mysql sql sql-order-by where-clause sql-like


    【解决方案1】:

    考虑:

    ORDER BY 
        (video.name LIKE '%topspeed%') + (video.name LIKE '%audi%') DESC,
        id
    

    基本原理:在数字上下文中,如果为真,MySQL 条件表达式返回1,否则返回0。因此,在两种条件下都匹配的视频将获得 2 的值,而在一个条件下匹配的视频仅获得 1。您可以对其使用降序排序。我在ORDER BY 子句中添加了另一个标准,通过打破关系来获得确定性排序。

    【讨论】:

      【解决方案2】:

      在 MySQL 中,您可以这样做:

      SELECT v.*
      FROM video v
      WHERE v.name LIKE '%topspeed%' OR v.name LIKE '%audi%'
      ORDER BY (v.name LIKE '%topspeed%') + (v.name LIKE '%audi%') DESC;
      

      MySQL 将布尔值视为数字上下文中的数字,1 表示“真”,0 表示“假”。

      注意另外两个变化。我添加了一个表别名,以便在限定列名时更容易引用该表。我还将'%%audi' 更改为'%audi%'。连续两个'%'s 没有'%' 做的任何事情。

      【讨论】:

        【解决方案3】:
        SELECT 
           id,
           name,
           (CASE WHEN video.name LIKE '%topspeed%' THEN 1 ELSE 0 END + 
            CASE WHEN video.name LIKE '%%audi%' THEN 1 ELSE 0 END)  as score
        FROM video WHERE video.name LIKE '%topspeed%' OR video.name LIKE '%%audi%'
        ORDER BY score DESC;
        

        此查询也适用于 MS-SQL,这就是我使用 CASE WHEN....END 的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-26
          相关资源
          最近更新 更多