MySQL查询顺序由多个项目无效

时间:2015-04-07 04:15:04

标签: php mysql regex

我目前正在处理一个必须提取

排序标题的查询
  1. 完全匹配,
  2. 首先是最高数量的匹配词,
  3. 跟随查询中的第一个单词是标题中的第一个单词,
  4. 按照字母顺序排列。
  5. 这样的事情:

    SELECT title
    
    FROM title
    
    WHERE title LIKE '%keyword%' OR LIKE '%keyword1%' OR LIKE '%keyword2%'
    
    order by
    
    case when title == 'keyword' then 0 else 1 end asc, 
    
    ((title like '%keyword1%') + (title like '%keyword2%')) desc, 
    
    case when title like 'keyword1%' then 0 else 1 end asc, 
    
    title asc;
    

    我测试了8个标题。

    搜索:“Buford Christmas”。

    结果:

    • Buford Christmas

    • 圣诞节Buford

    • Buford先生

    • Buford先生

    • Buford和Lisa

    • Lisa Christmas

    • 我圣诞节

    • Me Buford Lisa。

    我需要找到一种方法来对标题进行排序,以便“Buford和Lisa”应该出现在“Buford先生”之前。

    查询中的关键字可能包含任意数量的子关键字,导致MySQL语句中的代码动态更改。我的示例代码是使用包含2个子关键字的关键字生成的。似乎没有工作的部分是:“当'keyword1%'之类的标题然后0其他1结束asc时的情况”我想知道代码是否在逗号分隔的顺序序列中处于错误位置或者我应该分配不同的数字到'然后'和'其他'。


    关于我的选择代码:

    在我的select语句中,如果关键字是“Buford Christmas”,则会分为“Buford”,“Christmas”和“Buford Christmas”。

    关于订购代码的这一部分:

    ((title like '%keyword1%') + (title like '%keyword2%')) desc, 
    

    MySQL将布尔表达式视为数字,其中true为1.因此,这会计算匹配数。

1 个答案:

答案 0 :(得分:0)

select title 
  from books
    where title like '%buford christmas%'
      or title like '%buford%'
      or title like '%christmas%'
  order by
    case 
      when
        title = 'buford christmas' then 1
      when
        title like '%buford%' and title like '%christmas%' then 2
      when
        title like 'buford%' then 3
      when
        title like '%buford%' then 4
      when
        title like 'christmas%' then 5
      when 
        title like '%christmas%' then 6
      end 
    asc;

这将做你正在寻找的事情。显然在那里替换文字的变量。它优先考虑结果:

Books with title that EXACTLY matches the keywords
Books with titles that CONTAIN BOTH keywords
Books with titles that START with the first keyword
Books that CONTAIN the first keyword
Books that END with the last keyword
Books that CONTAIN the last keyword

演示:http://sqlfiddle.com/#!9/ec62a/7

修改 您可能还需要考虑全文索引,例如:create fulltext index ftx_title on books(title),然后您可以按原样运行查询:

select * 
  from books 
  where match(title) 
    against ('buford christmas' in boolean mode);

这会使您对关键字的查询变得更加简单