2009-06-18 12 views
2

"view_count"列を持つ表があります。MySQL - 行が選択されるたびにビュー列が更新されます

私は行を選択するたびに上記の列をインクリメントしたいと思います(SELECT * FROM table WHERE 1などの一般的なSELECTを使用していても)。これはすべての行のview_countを1だけ増やします。

自動的に "サーバー側"(mysqlはサーバーで、私のアプリケーションはクライアントです)、つまり毎回UPDATEを行わない方法がありますか?

編集:何人かの人が私にこれをやりたがっていると尋ねたので、私の要求を誤解しました。それがフォーラムソフトウェアだと想像してください。テーブルはスレッドテーブルです。各スレッドはビュー数を持っており、メインページにスレッドを表示するたびに更新する必要があります(通常、スレッドのビュー数は実際に表示するときにのみ更新されますが、私の特定のケースは、あなたがセッションスコープでそれを行うことができます

+0

私はあなたがこれをやりたい理由について興味があります。 – yfeldblum

答えて

6

できません。基本的にをSELECTに設定し、トリガーはINSERT,UPDATEDELETEの場合にのみサポートされます。あなたが得ることができる最も近いのは、ストアドプロシージャを介してテーブルとのすべてのやりとりを実行することです。すべての条件でこの動作を強制するように思えます。

0

)T_Tちょっと長く複雑である:

SELECT q.*, 
     @view_count := @view_count + 1 AS view_count 
FROM (
     SELECT 1 AS col 
     UNION ALL 
     SELECT 2 AS col 
     ) q; 

-- -- 
1 1 
2 2 

SELECT q.*, 
     @view_count := @view_count + 1 AS view_count 
FROM (
     SELECT 1 AS col 
     UNION ALL 
     SELECT 2 AS col 
     ) q; 

-- -- 
1 3 
2 4 

SET @view_count := 0; 

SELECT v.*, 
     @view_count := @view_count + 1 AS view_count 
FROM view 

は、あなたが見た場合の各列のためのインクリメント値を持つことになりますただし、セッション内のビューのみをカウントします。総視聴回数

+0

ありがとうございましたが、私は各行に対して1つのview_countを必要としていました。私はあなたが "グローバル変数" view_countのためのメソッドを提供したことを理解しているようです。それはフォーラムスレッドテーブルのように考える - 各スレッドにはいくつかのビューがあります。 –

0

私はこのサーバーサイドを行う簡単な方法はないと思います。トリガーは、UPDATE、INSERT、およびDELETEでのみ実行されます。でも動的に任意の言語で簡単に作成することができ

UPDATE tableName SET viewCount = viewCount + 1; SELECT tableName.col1, tableName.col2; 

1

理由だけではなく、そのような1つのSQL文を発行しません。

+0

WHEREを2度処理するので、やりたくはありませんでした。 たとえば、 SELECT * FROM mytable WHERE topic_id = 123 UPDATE mytable SET viewcount = viewcount + 1 WHERE topic_id = 123 // WHERE –

+0

@Koperを再評価します。 'where topic_id = 123'を実行するのは、O(1)の一定時間タスク(検索と比較は不要)です。また、dbはクエリ結果をキャッシュするので、2つの同様のクエリの場合、2つの最適化が行われます。パフォーマンスの賢明さ、これらの2つのクエリを行うことを避けようとすると無駄です... –

0

ストアドプロシージャが、それは痛みです。私は他の場所でセキュリティを実装します。

関連する問題