我有一个这样的MySQL表jobs
:
ID | title | keywords
1 | UI Designer | HTML, CSS, Photoshop
2 | Web site Designer | PHP
3 | UI/UX Developer | CSS, HTML, JavaScript
我有这样的查询:
SELECT * FROM jobs
WHERE title LIKE '%UX%' OR title LIKE '%UI%' OR title LIKE '%Developer%' OR keywords LIKE '%HTML%' OR keywords LIKE '%CSS%'
我想按相似度排序结果。
例如对于第一行( ID 1 ),记录行中有UI
和HTML
和CSS
。那么第一行 CORRECT LIKE 条件的数量为 3 。与此计算相同,第二行为 0 ,第三行为 5 。
然后我希望结果按 CORRECT LIKE 条件的数量排序,如下所示:
Results
ID | title | keywords
3 | UI/UX Developer | CSS, HTML, JavaScript
1 | UI Designer | HTML, CSS, Photoshop
然后,是否有必要计算查询中每行的相似度并按照我的描述对结果进行排序?
答案 0 :(得分:1)
您可以使用if
来按顺序对匹配的结果进行求和。SELECT *
FROM jobs
WHERE title LIKE '%UX%'
OR title LIKE '%UI%'
OR title LIKE '%Developer%'
OR keywords LIKE '%HTML%'
OR keywords LIKE '%CSS%'
ORDER BY (title LIKE '%UX%'+ title LIKE '%UI%'+
keywords LIKE '%HTML%'+ keywords LIKE '%HTML%') DESC
如果返回1或0,则添加真实结果应该使最匹配的行变平
答案 1 :(得分:0)
您不应在这样的字符串中存储关键字。您应该有一个单独的表。
如果(由于某种原因,例如其他人的确非常,非常非常糟糕的设计选择)必须处理此数据,则应考虑分隔符。在MySQL中,出于这个目的,我建议使用find_in_set()
:
SELECT j.*
FROM jobs j
WHERE title LIKE '%UX%' OR
title LIKE '%UI%' OR
title LIKE '%Developer%' OR
FIND_IN_SET('HTML', REPLACE(keywords, ', ', '')) > 0 OR
FIND_IN_SET('CSS', REPLACE(keywords, ', ', '')) > 0
ORDER BY ( (title LIKE '%UX%') +
(title LIKE '%UI%') +
(title LIKE '%Developer%') +
(FIND_IN_SET('HTML', REPLACE(keywords, ', ', '')) > 0) +
(FIND_IN_SET('CSS', REPLACE(keywords, ', ', '')) > 0)
) DESC ;
这会找到与关键字完全匹配的内容。
您可以将WHERE
(而不是ORDER BY
)简化为:
WHERE title REGEXP 'UX|UI|Developer' OR
FIND_IN_SET('HTML', REPLACE(keywords, ', ', '')) > 0 OR
FIND_IN_SET('CSS', REPLACE(keywords, ', ', '')) > 0