2

私は、PHP と MYSQL の評価システムに取り組んでおり、賛成票と反対票を投じています。

登録ユーザーが行ったすべての投票を含むというデータベースがvotesあります(賛成票の場合は1、反対票の場合は-1)、評価できるすべての投稿に対して、すべての賛成票、反対票、および正味票の要約があります(プラスマイナスマイナス票)。

誰かが投稿に賛成票を投じると、INSERT ... ON DUPLICATE KEY UPDATEすべての投票を含むテーブルを挿入または更新するクエリがあります。次に、新しい賛成票、反対票、および新しい純票の数で投稿行を更新します。

私の問題は、最初のクエリが挿入か更新かを知る必要があることです。更新の場合は、古い投票を差し引いて新しい投票を追加する必要がありますが、それは単に挿入である必要はありません。何かを差し引いて、投票を増やすだけです。

4

2 に答える 2

2

あなたがテーブルの上にいると仮定するとPRIMARY KEY、あなたはこれを行うことができます:

SET @last_insert_id := IFNULL(LAST_INSERT_ID(), 0);

INSERT ... ON DUPLICATE KEY UPDATE ...

SELECT IFNULL(LAST_INSERT_ID(), 0) <> @last_insert_id AS inserted;

がTRUEの場合inserted、レコードが挿入され、FALSEの場合、既存のレコードが更新されました。

もちろん、このコードは、最初のコードがLAST_INSERT_ID()別のテーブルへの挿入から設定されていないことを前提としています。

于 2012-07-22T18:30:48.033 に答える
2

投票の計算を時期尚早に最適化しないことをお勧めします。また、ある投稿に新しい投票が行われるたびに、それが再計算をトリガーしたINSERTかどうかに関係なく、この投稿のすべての投票を再計算することをお勧めします。UPDATE次に、結果を DB に格納します。

さらに、必要なときにいつでも総投票数のキャッシュを破棄して、その場で計算する方が簡単です。

パフォーマンスの問題に直面した場合にのみ、費用を測定し、ボトルネックが何であるかを確認する必要があります。おそらく、投票の計算は、アプリケーションで最初に最適化するべきではありません。

生活をよりシンプルに。

于 2012-07-22T18:06:29.553 に答える