0

私の検索クエリは次のように実行されます。

 select * from posts p where p.post like '%test%' ORDER BY p.upvotes DESC, 
 p.unix_timestamp DESC LIMIT 20

検索されたキーワードの結果が 20 件を超える場合、タイムスタンプの最小値を見つけて隠し要素に格納し、次のような結果をさらに読み込む別のクエリを実行します。

select * from posts p where p.post like '%test%' and p.unix_timestamp < 1360662045
ORDER BY p.upvotes DESC, p.unix_timestamp DESC LIMIT 20

実際に起こっていることは、私の最初のクエリが、私のせいで投票されていない (0 票を意味する) 投稿を無視している (明らかに、私の間違い) ということですORDER BY p.upvotes DESC。最初の 20 件の結果で、最小のタイムスタンプが最初の投稿のタイムスタンプになります。この後、最小タイムスタンプよりも小さい次の 20 件の結果をフェッチしようとしても、何も得られません。

現在、私は単純に賛成票の順序を使用して上位のレコードを取得しています。ベイジアン平均やその他のアルゴリズムなどのアルゴリズムを使用する必要がありますか?

現在の注文システムにとどまらなければならない場合、または使用すべき実行可能でより効率的な方法がある場合、クエリを改善する方法を教えてください。

PS可能であれば、ベイジアン平均(最も使用されているようです)または他の代替手段に関するいくつかのリソースを参照してください。

4

1 に答える 1

0

最初に検索を行ったときにタイムスタンプを保存し、それを次のクエリに使用すると、次のようなものを使用できます。

$sql = "SELECT * 
FROM posts p 
LEFT OUTER JOIN (SELECT post_id, COUNT(*) FROM post_ratings WHERE timestamp_rated <= $SomeTimeStoredBetweenPages GROUP BY post_id) pr ON p.id = pr.post_id 
WHERE p.post like '%test%' 
ORDER BY pr.post_ratings DESC, p.unix_timestamp 
DESC LIMIT ".(($PageNo - 1) * 20)." 20";

私はあなたのテーブル構造について本当の考えを持っていないので、これは非常に例です。また、賛成票ごとに行があるだけなのか、それとも反対票があるのか​​ もわかりません。

于 2013-03-26T10:46:55.243 に答える