繁体   English   中英

使用多表联接进行搜索查询的SQL

[英]SQL for search query with multiple table join

我有下表

文献

  • docid(PK)
  • 网址

数据

  • wordid(PK)

标题

  • 字词
  • docid

(wordid和docid组合唯一)

url

  • 字词
  • docid

(wordid和docid组合唯一)

为了搜索任何短语,我将其分解为单词并获取其wordid wtitlewurl用于对行进行评分以进行排名。 我打算添加更多表进行评分,例如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)

我有以下疑问

  1. 如何检查每个表wtitlewurl两个或更多,因为当前它在wtitle中搜索1st,因为LEFT JOIN和其他联接被忽略了?
  2. 如何正确构架此SQL查询?

    SQL资料库http://sqlfiddle.com/#!9/ab0052/4/0

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM