0

次のテーブルがあるとします。

items table
item_id|view_count

item_views table
view_id|item_id|ip_address|last_view

私がやりたいことは次のとおりです。特定のip_addressによる特定のitem_idを持つアイテムの最後のビューが1時間以上前だった場合、アイテムテーブルのアイテムのview_countを増やしたいと思います。その結果、アイテムのビュー数を取得します。通常の方法:

q = SELECT count(*) FROM item_views WHERE item_id='item_id' AND ip_address='some_ip' AND last_view < current_time-60*60

if(q==1) then q = UPDATE items SET view_count = view_count+1 WHERE item_id='item_id'

//and finally get view_count of item
q = SELECT view_count FROM items WHERE item_id='item_id'

ここでは、3 つの SQL クエリを使用しました。1 つの SQL クエリにマージするにはどうすればよいですか? そして、それは処理時間にどのように影響しますか? 以前の方法よりも速くなったり遅くなったりしますか?

4

2 に答える 2

0

あなたの論理は、あなたが望むものについて正しいとは思いません。クエリ:

SELECT count(*)
FROM item_views
WHERE item_id='item_id' AND
      ip_address='some_ip' AND
      last_view < current_time-60*60

は、あなたの時間枠よりも前の視聴回数をカウントしています。私はあなたが欲しいと思います:

      last_view > current_time-60*60

そしてif q = 0次の行にあります。

MySQL は のパフォーマンスで非常に優れているnot existsため、次のようにするとうまくいくはずです: AND last_view > current_time-60*60 )

item_views(item_id, ip_address, last_view)のインデックスと のインデックスを使用すると、はるかにうまく機能しitem(item_id)ます。

MySQL スクリプトでは、次のように記述できます。

. . .
     set view_count = (@q := view_count+1)
. . .

これにより、探している変数も得られます。

于 2013-05-23T01:30:08.233 に答える
0
update target
    set target.view_count = target.view_count + 1
from items target
inner join (
    select item_id
    from item_views
    where item_id = 'item_id'
        and ip_address = 'some_ip'
        and last_view < current_time - 60*60
    ) ref
    on ref.item_id = target.item_id;

上記の例のように、結合を使用して update ステートメントを条件とのみ組み合わせることができます。ただし、別の select ステートメントが必要です。非常に大きなセットやインデックスのないテーブルでは遅くなることがあります。

于 2013-05-23T00:46:47.110 に答える