簡體   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