2017-02-07 6 views
0

特定のニーズに合わせてSQLクエリを実行しましたが、SQLの専門家ではないため、クエリを「改善する」必要があります。最適化SQLクエリの更新は別のテーブルに依存する

まず、私は3つのテーブルがあります。

  • ユーザー(ID、ユーザ名、...)
  • アクション(ID、ポイント、limitPerDay)
  • 歴史(ID、USER_ID、action_id、created_atとを、is_used_for_score)

をするたびに、ユーザは、それが履歴テーブル内のログ特定のアクションであるか(上限に達していないか、されている場合is_used_for_scoreが真または偽となります)

しかし、一定の条件のis_used_for_scoreの下で私のクエリは実際に私はかなり確信している、

SET @num := 0, @user_id := 0, @type := '', @date := ''; 

UPDATE history SET is_used_for_score = 1 WHERE history.id IN (
    SELECT history_id FROM (
     SELECT 
      history.id AS history_id, 
      action.limitPerDay AS limit_per_day, 
      action.point, 
      @num := IF(
       @type = action_id, 
       IF(
        @date = CONCAT(YEAR(history.created_at), '-', MONTH(history.created_at), '-', DAY(history.created_at)), 
        IF (
         @user_id = user_id, 
         @num + 1, 
         1 
        ), 
        1 
       ), 
       1 
      ) AS row_number, 
      @user_id := user_id AS user_id, 
      @type := action_id AS action_id, 
      @date := CONCAT(YEAR(history.created_at), '-', MONTH(history.created_at), '-', DAY(history.created_at)) AS `date` 
     FROM history 
     LEFT JOIN `action` ON action.id = action_id 
     HAVING (row_number <= limit_per_day) OR (limit_per_day IS NULL) 
     ORDER BY history.created_at ASC, user_id, action_id 
    ) AS history_id_count_for_vote 
); 

である。しかし、真

偽から渡すことができますので、私はすべてのis_used_for_score更新のためのクエリを必要とするが、おそらく最善の方法ではありませんそれをする。あなたはクエリを改善できるいくつかの提案がありましたか?

はこのような問題に

+0

私はそれを見越しているわけではありません。とにかく幸運。 – Strawberry

+0

'is_used_for_score'の計算方法を英語で説明してください。 –

答えて

1

ありがとう、私は何度も何度も、執拗に繰り返しています:SQLの宣言型言語である、(あなたが同じように、imperativenessに陥る)このことを忘れないでください!

つまり、あなたは作業する予定のセットを宣言し、宣言します。言い換えれば、あなたが望むものを伝え、HOWを任せて任せてください。

これが基本です。

このように考えてみてください:「いくつかのレコードセットを更新する必要があります。特定の条件is_used_for_scoreはfalseからtrueに渡すことができます。

ここには欠けているものがありますので、これらの条件を定義して質問を更新してください。あなたが投稿したばかげたものからそれを抽出しようとするかなりの時間を節約してください。

+0

何度も何度も何度も?あなたは14の質問に答えました。しかし、最後のポイントに同意する! – Strawberry

+0

stackoverflowはその惑星の唯一の場所ではありません:-) –

+0

ああ! :-) – Strawberry