[英]SQL for search query with multiple table join
我有下表
文献
- docid(PK)
- 网址
数据
- wordid(PK)
- 字
标题
- 字词
- docid
(wordid和docid组合唯一)
url
- 字词
- docid
(wordid和docid组合唯一)
为了搜索任何短语,我将其分解为单词并获取其wordid
。 表wtitle
, wurl
用于对行进行评分以进行排名。 我打算添加更多表进行评分,例如inlink,inh1标签等。但是,在对搜索词进行sql查询时存在问题。
我的SQL查询就像
SELECT d.docid,furl,IF(t.wordid IS NULL,0,1) AS intitle,IF(u.wordid IS NULL,0,1) AS inurl FROM document d
LEFT JOIN wtitle t ON t.docid=d.docid
LEFT JOIN wdata w ON w.wordid=t.wordid
LEFT JOIN wurl u ON u.wordid=w.wordid AND u.docid=d.docid
WHERE w.wordid IN (wordid1,wordid2,wordid3)
我有以下疑问
wtitle
和wurl
两个或更多,因为当前它在wtitle中搜索1st,因为LEFT JOIN和其他联接被忽略了? 如何正确构架此SQL查询?
Wordid 3在URL中,但不在Docid 2的标题中
Wordid 3不在URL中,但在Docid 3的标题中
我想同时返回doc 2和doc 3,因为它首先通过wtitle联接,而忽略了(使用第一个查询数据)其他联接
如果你想知道是否说了,两个字你正在寻找既出现在文档中,你必须看标题和URL相结合。 (否则,如果您知道标题中存在一个单词,而url中存在一个单词,则您将不知道它是同一单词还是两个单词。)因此,首先将两个表与UNION ALL
结合使用,但要记住哪个记录属于哪张桌子。 然后,我们可以计算每个位置的总和(标题或网址)。
这是一个查询,该查询查找单词ID 3和4。它首先列出与两个单词匹配的条目,然后列出与其中一个单词匹配的文档:
SELECT
d.docid,
d.furl,
w.cnt_combined,
w.cnt_in_title,
w.cnt_in_url
FROM document d
JOIN
(
select
docid,
count(distinct wordid) cnt_combined,
sum(place = 'TITLE') cnt_in_title,
sum(place = 'URL') cnt_in_url
from
(
select 'TITLE' as place, docid, wordid from wtitle where wordid in (3,4)
union all
select 'URL' as place, docid, wordid from wurl where wordid in (3,4)
) both_tables
group by docid
) w ON w.docid = d.docid
order by w.cnt_combined desc;
您可以通过替换来查找单词而不是单词ID
where wordid in (3,4)
通过
where wordid in (select wordid from wdata where word in ('vaccination', 'the'))
Rextester链接: http ://rextester.com/KPVX67861(SQL小提琴在大多数情况下对我不起作用。)
我建议这些涵盖指标:
CREATE INDEX idx_wtitle ON wtitle(wordid, docid);
CREATE INDEX idx_wurl ON wurl(wordid, docid);
首先使用wordid
,DBMS可以轻松找到条目,并且docid
已经在索引中,因此DBMS不必访问表。 它从索引中获取所有数据。 (这就是为什么将它们称为覆盖索引的原因;它们覆盖了查询所需的所有列。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.