我想根据某些条件对SQL查询结果集的结果进行排名:
FULL TEXT-AGAINST对可用于单列但不能满足所有条件。 如果有任何方式请分享。
现在我在一些建议的答案之后使用了这个:
SELECT * FROM (SELECT *, DATE_FORMAT(date, '%d %b, %Y')AS dt,
case when title LIKE '%".$fkeyword."%' then 6 else 0 end +
case when description LIKE '%".$fkeyword."%' then 3 else 0 end +
case when Channel_Name LIKE '%".$fkeyword."%' then 1 else 0 end +
case when Industry_Name LIKE '%".$fkeyword."%' then 1 else 0 end +
case when Company_Name LIKE '%".$fkeyword."%' then 1 else 0 end as score FROM Search
WHERE title LIKE '%".$fkeyword."%' or
Channel_Name LIKE '%".$fkeyword."%' or
Company_Name LIKE '%".$fkeyword."%' or
description LIKE '%".$fkeyword."%' or
Industry_Name LIKE '%".$fkeyword."%') scored order by score desc
答案 0 :(得分:1)
这对于非常大的表格不适用,但会给你一个起点:
SELECT * FROM (
SELECT *, DATE_FORMAT(date, '%d %b, %Y') AS dt,
IF(title LIKE '%".$fkeyword."%', 1, 0) +
IF(Channel_Name LIKE '%".$fkeyword."%', 2, 0) +
IF(Company_Name LIKE '%".$fkeyword."%', 1, 0) +
IF(Industry_Name LIKE '%".$fkeyword."%', 1, 0) +
...
IF(Platform_Description LIKE '%".$fkeyword."%', 1, 0) as score
FROM Search
) scored_results
WHERE score > 0
ORDER BY score DESC
得分> 0可以用不同的阈值替换。
IF(条件,1,0)中的1,0个数字可以被其他评分替换,甚至是负数。例如:IF(标题为'%foo%',10,-5)
答案 1 :(得分:1)
我认为像这样的逻辑封装了你的条件:
SELECT s.*, DATE_FORMAT(date, '%d %b, %Y') AS dt
FROM Search s
WHERE CONCAT_WS(':', title, channel_name, . . . ) LIKE '%".$fkeyword."%'
ORDER BY (LENGTH(REPLACE(CONCAT_WS(':', title, channel_name, . . . ), $fkeyword, CONCAT($fkeyword, 'x'))
) -
LENGTH(CONCAT_WS(':', title, channel_name, . . . ))
) DESC,
INSTR(CONCAT_WS(':', title, channel_name, . . . ), $fkeyword);
我强烈建议您放松条件并实施全文搜索。