SQL查询根据最大公共结果对结果进行排序

时间:2015-02-25 06:22:46

标签: mysql sql

我在进行SQL查询时遇到问题。我正在制作一个小型搜索引擎,其中的页面映射或索引保持这样。 抱歉,我无法在此处发布图片,所以我尝试写这样的输出。

+---------+---------+-----------+--------+

| word_id | page_id | frequency | degree |

+---------+---------+-----------+--------+

|    2331 |      29 |         2 |      1 |

|    2332 |      29 |         7 |      1 |

|    2333 |      29 |         4 |      1 |

|    2334 |      29 |         1 |      1 |

|    2335 |      29 |         1 |      1 |

|    2336 |      29 |         1 |      1 |

|    2337 |      29 |         2 |      1 |

|    2338 |      29 |         7 |      1 |

|    2343 |      29 |         1 |      3 |

|    2344 |      29 |         1 |      3 |

......
......
...... and so on.

Word_id指向其他表格中的单词,page_id指向其他表格中的网址。

现在假设我想搜索"快速3D原型制作服务"。我通过查询带来了与单个单词对应的结果联合 - >

select * from words_detail where word_id=2353 or word_id=2364 or word_id=2709 or word_id=2710;

在上面的查询中,word_ids对应于搜索查询中的4个单词,结果如下。

与单个单词相对应的page_id的联合......

的MySQL>

select * from words_detail where word_id=2353 or word_id=2364 or word_id=2709 or word_id=2710;


+---------+---------+-----------+--------+

| word_id | page_id | frequency | degree |

+---------+---------+-----------+--------+

|    2353 |      29 |         2 |      4 |

|    2353 |      33 |         2 |      2 |

|    2353 |      36 |         5 |      9 |

|    2353 |      40 |         1 |      4 |

|    2353 |      41 |         1 |      9 |

|    2353 |      45 |         4 |      9 |

|    2353 |      47 |         2 |      9 |

|    2353 |      49 |         4 |      9 |

|    2353 |      52 |         1 |      4 |

|    2353 |      53 |         1 |      9 |

|    2353 |      66 |         2 |      9 |

|    2364 |      29 |         1 |      4 |

|    2364 |      34 |         1 |      4 |

|    2364 |      36 |         9 |      2 |

|    2709 |      36 |         1 |      9 |

|    2710 |      36 |         1 |      9 |

+---------+---------+-----------+--------+

16 rows in set (0.00 sec)

但我希望根据最大匹配对结果进行排序。较早的结果应该是所有4个单词匹配的位置,下一个结果应该是3个匹配,依此类推。换句话说,早期的结果应该具有4个word_id共有的page_id,接下来应该是3个words_ids中常见的那些,依此类推。

我检查了here,但这在我的情况下不起作用,因为在我的情况下OR条件在一行中不匹配。

如何设计这样的查询?

3 个答案:

答案 0 :(得分:0)

使用您page_id出现的匹配计数,然后按顺序排序。

select * from words_detail A
inner join 
(SELECT PAGE_ID
, COUNT(PAGE_ID) matchCount
from words_detail 
where word_id=2353 or word_id=2364 or word_id=2709 or word_id=2710
group by PAGE_ID) B
on A.PAGE_ID=B.PAGE_ID
where word_id=2353 or word_id=2364 or word_id=2709 or word_id=2710
order by matchCount desc

答案 1 :(得分:0)

试试这个

   select p.*
  from words_detail p
 , (select word_id, count(1) as count
  from words_detail where 
   word_id in (2353,2364,2709,2710) group by word_id) t
 where p.word_id = t.word_id
 order by t.count desc;

答案 2 :(得分:0)

您可以执行子查询来获取每个页面的外观数量。然后你必须将子查询加入到你的表中,你就可以按页面出现次数来排序结果。

您的最终查询应如下所示:

  SELECT *
    FROM words_detail,
         (
              SELECT page_id, 
                     COUNT(*) AS npages
                FROM words_detail 
               WHERE word_id IN (2353, 2364, 2709, 2710)
            GROUP BY page_id
         ) AS matches

   WHERE words_detail.page_id = matches.page_id
     AND word_id IN (2353, 2364, 2709, 2710)
ORDER BY matches.npages DESC