MySQL智能排序结果

时间:2017-10-27 08:23:42

标签: mysql sql

我有一个MySQL查询,它根据title相关性和title,description,tags相关性返回给定信息的相关数据。

问题是,当我对剧集列表进行特定搜索时,relevancetitle_relevance具有相同的比率。如果它们完全相同,我想根据剧集编号订购结果。

示例查询;

SELECT   `test_vids`.id , 
         `test_vids`.title, 
         test_vids.tags, 
         MATCH (title,description,tags) against ('Vikingler 1. Bölüm,Vikingler,Bölüm,vikingler vicky' IN boolean mode) AS relevance,
         MATCH (title) against ('Vikingler 1. Bölüm,Vikingler,Bölüm,vikingler vicky'      IN boolean mode) AS title_relevance
FROM     `test_vids` 
WHERE    MATCH (title,description,tags) against('Vikingler 1. Bölüm,Vikingler,Bölüm,vikingler vicky' IN boolean mode)
AND      `test_vids`.pub > 0 
ORDER BY title_relevance DESC, 
         relevance DESC, 
         cast(title AS UNSIGNED) DESC 
LIMIT    0, 20

示例结果;

id     |  title                                        | tags                    | relevance          | title_relevance   |
XXXXXX | Flori Mumajesi Karma Ft Bruno Klajdi Dj Vicky | yabanci,pop,müzik,dinle | 15.147967338562012 | 21.81067657470703   ##WTF IS THIS???
XXXXXX | Vikingler 4. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 3. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 6. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 8. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 10. Bölüm                           | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 5. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 1. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 7. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 9. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 2. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346

预期结果;

id     |  title                                        | tags                    | relevance          | title_relevance   |
XXXXXX | Vikingler 1. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 2. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 3. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 4. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 5. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 6. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 7. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 8. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 9. Bölüm                            | vikingler vicky         | 31.47698974609375  | 6.191696643829346
XXXXXX | Vikingler 10. Bölüm                           | vikingler vicky         | 31.47698974609375  | 6.191696643829346

如何正确订购?

提前致谢!

1 个答案:

答案 0 :(得分:0)

CONVERT(REPLACE(RIGHT(LEFT(title ,12) ,3),'.',''), UNSIGNED INTEGER)添加到您的ORDER BY

SELECT   `test_vids`.id , 
         `test_vids`.title, 
         test_vids.tags, 
         MATCH (title,description,tags) against ('Vikingler 1. Bölüm,Vikingler,Bölüm,vikingler vicky' IN boolean mode) AS relevance,
         MATCH (title) against ('Vikingler 1. Bölüm,Vikingler,Bölüm,vikingler vicky'      IN boolean mode) AS title_relevance
FROM     `test_vids` 
WHERE    MATCH (title,description,tags) against('Vikingler 1. Bölüm,Vikingler,Bölüm,vikingler vicky' IN boolean mode)
AND      `test_vids`.pub > 0 
ORDER BY CONVERT(REPLACE(RIGHT(LEFT(title ,12) ,3),'.',''), UNSIGNED INTEGER)
         title_relevance DESC, 
         relevance DESC, 
         cast(title AS UNSIGNED) DESC 
LIMIT    0, 20

小例子:

输入

Vikingler 4. Bölüm
Vikingler 3. Bölüm
Vikingler 6. Bölüm
Vikingler 8. Bölüm
Vikingler 10. Bölüm
Vikingler 5. Bölüm
Vikingler 1. Bölüm
Vikingler 7. Bölüm
Vikingler 9. Bölüm
Vikingler 2. Bölüm

代码

SELECT title
FROM yourtable
ORDER BY CONVERT(REPLACE(RIGHT(LEFT(title ,12) ,3),'.',''), UNSIGNED INTEGER)

输出

title
Vikingler 1. Bölüm
Vikingler 2. Bölüm
Vikingler 3. Bölüm
Vikingler 4. Bölüm
Vikingler 5. Bölüm
Vikingler 6. Bölüm
Vikingler 7. Bölüm
Vikingler 8. Bölüm
Vikingler 9. Bölüm
Vikingler 10. Bölüm

SQL小提琴:http://sqlfiddle.com/#!9/7c74bd/24/0