MySQL 智能排序结果

标签 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

如何正确订购?

提前致谢!

最佳答案

添加 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 fiddle :http://sqlfiddle.com/#!9/7c74bd/24/0

关于MySQL 智能排序结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46970570/

相关文章:

sql - 有没有办法查询表格中缺失的数字?

iphone - SQLite 语法(按引起错误的顺序排列)

php - 提供的参数不是有效的mySQL资源

mysql - 字符串中相邻字符的 SQL 正则表达式

mysql - 从 ID 列表中选择数千行的最有效方法

php - 更新关联数组键

sql - 连接到 Azure 托管的 SQL Server Analysis Services 服务器的表格实例

sql - Eclipse 伽利略 SQL 编辑器 : is there a code formatter (tidy) function?

sql - 使用 2 个表的 Select 语句返回 400 万条记录而不是 500k

java - 使用 SAX 解析器解析 XML 文件后将数据存储到 MySQL 的最佳方法是什么?