【问题标题】:Help understandaing this mySQL query with ORDER BY and CASE使用 ORDER BY 和 CASE 帮助理解这个 mySQL 查询
【发布时间】:2023-03-12 12:02:02
【问题描述】:

我正在尝试理解这个 mySQL 查询。它应该使用搜索关键字“brown fox lazy dog”搜索表“items”,并根据其相关性或在记录中出现的次数返回结果。

SELECT *
FROM `items`
WHERE `description` LIKE 'quick'
AND (
  `description` LIKE 'brown'
  OR `description` LIKE 'fox'
  OR `description` LIKE 'lazy'
  OR `description` LIKE 'dog'
)
ORDER BY (
  (
    CASE WHEN `description` LIKE 'brown'
    THEN 1
    ELSE 0
    END
  ) + (
    CASE WHEN `description` LIKE 'fox'
    THEN 1
    ELSE 0
    END
  ) + (
    CASE WHEN `description` LIKE 'lazy'
    THEN 1
    ELSE 0
    END
  ) + (
    CASE WHEN `description` LIKE 'dog'
    THEN 1
    ELSE 0
    END
  )
) DESC
LIMIT 0, 30

我不明白的部分是在 ORDER BY 和 CASE 子句中的部分。假设一条特定记录匹配所有 4 个正在搜索的关键字,我们得到 ORDER BY (4)?这 4 如何与正在考虑的特定行相关联?我的理解是 ORDER BY 通常用于列而不是数字?谢谢!

【问题讨论】:

  • 看起来您缺少通配符,目前它无法返回任何结果。 (应该是LIKE '%dog%' 等)

标签: mysql sql


【解决方案1】:

ORDER BY 可用于从每行中的字段派生的任何值。在这种情况下,我们按出现在description 字段中的重要单词的数量进行排序。因此,正如您所说,如果特定记录与所有 4 个关键字匹配,那么它会得到 4,并最终位于(降序)排序的顶部。如果记录只匹配其中一个关键字,它会得到 1 并最终到达底部。您甚至可以说 ORDER BY RAND(),这正是您所期望的。 ORDER BY RAND() LIMIT 1 是一个非常常见的习惯用法,用于从表中随机选择一行。但是,不要在大表上使用 ORDER BY RAND() LIMIT 1,因为它仍然会为每一行生成一个随机数(非常昂贵),只是为了找出哪个是最小的。

【讨论】:

    【解决方案2】:

    这里的数字是指用于排序结果的列,第一列是 1。
    在网上找不到相关的参考资料,但我偶然发现了它,它有时会派上用场。

    【讨论】:

    • 不,在这种情况下不适用。 ORDER BY <literal number> 给出了您描述的行为 - 即按序号位置标识的列进行排序 - 但这是 ORDER BY <computed value expression>
    • 有意思,反正在mysql的在线参考上都找不到。
    【解决方案3】:

    此查询用于按项目排序,比如“相关性”...

    例如,如果描述类似于 '%dog%',则 order by 将取 1,如果相同的描述包含 'lazy',order by 将是 1 + 1;这意味着当前行有两个关键字“狗”和“懒惰”。等等。

    这个查询是按照“包含最大关键字的描述”对项目进行排序,所以如果一行记录匹配所有 4 个关键字,那么它得到一个 4,并最终在(降序)排序的顶部。如果行记录只匹配其中一个关键字,它会得到一个 1 并最终到达底部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多