我在进行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条件在一行中不匹配。
如何设计这样的查询?
答案 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