对SQL查询结果集

时间:2018-03-03 12:14:09

标签: php sql

我想根据某些条件对SQL查询结果集的结果进行排名:

  • 关键字
  • 的出现
  • 首先匹配关键字标题,然后是公司名称,然后是另一列,依此类推......
  • 如果关键字在特定行中匹配超过2列,则应为该行提供首选项/更高级别

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

2 个答案:

答案 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);

我强烈建议您放松条件并实施全文搜索。