0

同じテーブルを3回結合せずに(または)同じ「wordlocation」テーブルを3回(または単語が多い場合はそれ以上)読み取らずに、クエリから次の結果を取得する方法はありますか?3 つ以上の単語がある場合、結果が返されるまでに約 1 分以上かかります。

現在、「wordlocation」テーブルには 3 つの行 (「bookid」、「wordid」、「location」) があり、現在 917802 行あります。

私がやろうとしていることは

  1. 「wordid」によってクエリで指定されたすべての単語を含む「bookid」を取得します。
  2. 各書籍の (クエリからの) すべての単語の合計単語数
  3. 各単語位置の最小値。たとえば、(min(w0.location)、min (w1.location)

count(w0.wordid) と min(location) の計算をコメントアウトして、それらがパフォーマンスに影響を与えているかどうかを確認しようとしましたが、そうではありません。同じテーブルに複数回参加することが当てはまりました。

ここに画像の説明を入力

(これは上の画像と同じコードです)

select 
    w0.bookid, 
    count(w0.wordid) as wcount, 
    abs(min(w0.location) + min(w1.location) + min(w2.location)) as wordlocation, 
    (abs(min(w0.location) - min(w1.location)) + abs(min(w1.location) - min(w2.location))) as distance 
    from 
    wordlocation as w0 
    inner join 
    wordlocation as w1 on w0.bookid = w1.bookid 
    join 
    wordlocation as w2 on w1.bookid = w2.bookid 
    where 
    w0.wordid =3 
    and 
    w1.wordid =52 
    and 
    w2.wordid =42
    group by w0.bookid 
    order by wcount desc;

これは私が探している結果であり、上記のクエリを実行して得たものですが、3 つ以上の単語を指定すると時間がかかりすぎます。たとえば (w0 = 3, w1 = 52 , w2 = 42, w3 = 71 )

ここに画像の説明を入力

4

1 に答える 1

0

このクエリを試してください

    SELECT bookid,
      ABS(L3+L52+L42) as wordlocation,
      ABS(L3-L52)+ABS(L52-L42) as distance
    FROM 
      (SELECT bookid, wordid, CASE WHEN wordid=3 THEN min(location) ELSE 0 END L3,
         CASE WHEN wordid=52 THEN min(location) ELSE 0 END L52,
         CASE WHEN wordid=42 THEN min(location) ELSE 0 END L42
      FROM wordlocation WL
      WHERE wordid in (3,52,42)
      GROUP BY bookid, wordid) T
    GROUP BY bookid

インデックスを作成する必要がある場合もありますwordid

于 2012-11-08T00:49:40.217 に答える