通过ORDER BY和CASE帮助理解此mySQL查询

通过ORDER BY和CASE帮助理解此mySQL查询,mysql,sql,Mysql,Sql,我试图理解这个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` LI

我试图理解这个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

我不明白的部分在订单条款和案例条款中。假设一个特定的记录匹配所有被搜索的4个关键字,我们得到的顺序是(4)?这4是如何与正在考虑的Particular行关联的?据我所知,ORDER BY通常用于列而不是数字?谢谢

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

这里的数字是指用于排序结果的列,第一列是1。

在网上找不到这方面的参考资料,但我意外地发现了这一点,有时它会派上用场。

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

例如,如果一个描述类似于“%dog%”,则按部分排序的order将为1,如果同一个描述包含“lazy”,则order by将为1+1;这意味着当前行有两个关键字“dog”和“lazy”。等等


此查询按“包含关键字最大值的描述”对项目进行排序,因此,如果行记录与所有4个关键字匹配,则会得到4,并最终位于(降序)排序的顶部。如果行记录只匹配其中一个关键字,它将得到1,并最终指向底部。

看起来您缺少通配符,目前它无法返回任何结果。(应该
像“%dog%”
等)不,在这种情况下不适用
ORDER BY
给出了您描述的行为——也就是在按序号位置标识的列上排序——但这是
ORDER BY
。有趣的是,无论如何,在mysql的在线参考上都找不到它们。