【问题标题】:MySQL - How to ORDER BY RELEVANCE? INNODB TableMySQL - 如何按相关性排序? INNODB 表
【发布时间】:2010-12-08 00:07:09
【问题描述】:

我在一个名为“cards”的 INNODB 表中有大约 20,000 行,因此 FULLTEXT 不是一个选项。

请考虑这张表:

id     |     name     |     description
----------------------------------------------------------
1        John Smith       Just some dude
2        Ted Johnson      Another dude
3        Johnathan Todd   This guy too
4        Susan Smith      Her too
5        Sam John Bond    And him
6        John Smith       Same guy as num 1, another record
7        John Adams       Last guy, promise

所以,假设用户搜索“John”,我希望结果集的顺序为:

7        John Adams
6        John Smith
3        Johnathan Todd
5        Sam John Bond
2        Ted Johnson

请注意,我们只提取了“约翰·史密斯”一次,我们提取了他最近的条目。由于我的数据,所有的名字都是同一个人的,不用担心两个叫约翰史密斯的不同的人。 想法?如果我能澄清任何事情,请告诉我。

【问题讨论】:

  • 您似乎想按“姓氏,名字”排序,而不是按相关性(无论如何定义)。这是正确的吗?

标签: mysql search sql-order-by innodb relevance


【解决方案1】:

版本 1:

SELECT max(id) id, name
  FROM cards
 WHERE name like '%John%'
 GROUP BY name
 ORDER BY CASE WHEN name like 'John %' THEN 0
               WHEN name like 'John%' THEN 1
               WHEN name like '% John%' THEN 2
               ELSE 3
          END, name

第 2 版:

SELECT max(id) id, name
  FROM cards
 WHERE name like '%John%'
 GROUP BY name
 ORDER BY CASE WHEN name like 'John%' THEN 0
               WHEN name like '% %John% %' THEN 1
               WHEN name like '%John' THEN 2
               ELSE 3
          END, name

【讨论】:

  • 太棒了!这和我想要的完全一样。谢谢najmeddine!
  • 很高兴为您提供帮助。为了处理更多的情况,我稍微修改了一下。
  • 我认为另一种方式在我的具体情况下效果更好,但它们都可能对其他人有帮助,为了后代,你能把它们都放在那里吗?
  • 任何人都知道我如何使用参数化值来做到这一点?
  • 您需要将 % 带入参数中
猜你喜欢
  • 1970-01-01
  • 2011-01-26
  • 2011-01-04
  • 2011-09-09
  • 2010-09-25
  • 2012-11-09
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多