【发布时间】:2015-04-27 01:31:30
【问题描述】:
我在进行 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 指向存在于其他表中的 URL。
现在假设我要搜索“快速 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个word_id共有的page_id,以此类推。
我检查了here,但这在我的情况下不起作用,因为在我的情况下 OR 条件在一行中不匹配。
如何设计这样的查询?
【问题讨论】: