MySQL:按类似程度排序?

35

假设我们使用关键词:keyword1,keyword2,keyword3 进行搜索

数据库中有一个名为“name”的列包含以下记录:

1: John Doe
2: Samuel Doe
3: John Smith
4: Anna Smith

现在进行查询:

SELECT * FROM users WHERE (name LIKE "%John%" OR name LIKE "%Doe%")

它将选择记录:1、2、3(按此顺序) 但我想按关键字排序 例如keyword1=John,keyword2=Doe 所以应该按关键字列出:1、3、2(因为我想在搜索“John”后执行搜索“Doe”)

我考虑使用SELECT DISTINCT FROM (...... UNION .....) 但以另一种方式进行排序会更容易些(真正的查询非常长)

有什么技巧可以创建这样的顺序吗?

5个回答

72
order by case 
    when name LIKE "%John%" then 1 
    when name LIKE "%Doe%"  then 2 
    else 3 
end

还有一件事——如果我理解得正确的话,每个LIKE会在整个查询中执行2次? - dfens
@dfens:我猜ORDER BY子句中的LIKE只会在被WHERE子句匹配的数据上执行,所以应该更快。 - D'Arcy Rittich

6

在RedFilter的回答基础上,您可以将同时包含关键词的行置于顶部:

order by case 
when (name LIKE "%John%" and name LIKE "%Doe%") then 1 
when name LIKE "%John%" then 2
when name LIKE "%Doe%"  then 3
end

3

2
 SELECT * 
 from
 (
  SELECT u.*, 1 OrderNum 
  FROM users 
  WHERE (name LIKE "%John%")
  UNION 
  SELECT u.*, 2 OrderNum 
  FROM users 
  WHERE (name LIKE "%Doe%")
  )
  Order by OrderNum

-1

我的示例将按字母顺序对所有的John排序,然后是Doe

ORDER BY CASE
    WHEN name LIKE "John%Doe" THEN CONCAT('a',name)
    WHEN name LIKE "John%"    THEN CONCAT('b',name)
    WHEN name LIKE "%Doe"     THEN CONCAT('c',name)
    ELSE name  
END  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接