1

自動インクリメント列 (レコードが入力された順序を追跡するため) と、最後に挿入されたレコードに対して 1 に設定された "CURRENT_FLAG" を持つことによってバージョン管理されたテーブルがあります。このテーブルを結合するビューは常に CURRENT_FLAG=1 を使用するため、最後のレコードのみが返されます。

したがって、構造が次のような場合:

AUTO_ID   PERSON_ID   PERSON_VALUE   CURRENT_FLAG
1         1           5452           0
2         1           637            1
3         2           4523           1       

次にレコードを挿入するときは、CURRENT_FLAG を更新する必要があります。今、私は次のようなものを実行します:

UPDATE T
LEFT JOIN (
     SELECT PERSON_ID, MAX(AUTO_ID) as AUTO_ID 
      FROM T 
  GROUP BY PERSON_ID
         ) as T1 ON T.PERSON_ID = T1.PERSON_ID and T.AUTO_ID = T1.AUTO_ID
SET T.CURRENT_FLAG = COALESCE(T.PERSON_ID / T.PERSON_ID, 0)

ただし、このクエリは、PERSON_ID と AUTO_ID の両方にインデックスがある場合でも、かなり小さなテーブルで数秒かかります。

レコードはステージング テーブルからバッチとして挿入され、一度に 1 人ずつ挿入されるわけではないため、auto_ids を取得して手動でフラグを設定したり、すべての current_flags を 0 に設定したりすることはできません。

そのクエリを作成する、またはトリガーやその他のソリューションを使用して同じことを行うより良い方法はありますか? MySQL 5.0+。

4

2 に答える 2

0

追加の列を作成する代わりに、最後に追加されたレコードを取得する方法がありCURRENT_FLAGます。降順で最初のレコードを取得してみてください。

SELECT [field1, field2, etc...] FROM `T`
WHERE [...]
ORDER BY AUTO_ID DESC
LIMIT 0, 1
于 2012-10-18T18:35:33.580 に答える
0

私は Marc B と一緒です。この CURRENT_FLAG をテーブルに保持し、サーバーを叩いて最新の状態に保つ代わりに、次のように各ユーザーの最新のレコードを取得するだけです。

  SELECT T.*
     FROM T
     WHERE AUTO_ID IN 
     (
          SELECT MAX(AUTO_ID) AS AUTO_ID
            FROM T
        GROUP BY PERSON_ID
      )

これをビューとして定義できます。WHERE 句を適用すると、次のようになります。

   WHERE T.PERSON_ID = :somebody

PERSON_ID と AUTO_ID にインデックスがある限り、オプティマイザーは正しいことを行います。

于 2012-10-18T18:41:53.690 に答える