1

私は。。をしようとしています

  1. データベースの最新の日付を取得し、
  2. その日付に基づいて、日付を持つすべてのレコードを更新しNULL、日付を 1 日増やします。

以下の最新の日付クエリを使用して、最新の日付を取得できます。テーブルの日付が順番になっていないため、最初にこれを行う必要があります。必要に応じて、このクエリを実行し、手動で書き留めてから、UPDATEこの日付に基づいてクエリを実行できます。手動プロセスなしですべてを実行したいと思います。

質問の最後にある最後のクエリは、日付を更新しようとするテストクエリですが、うまく機能しませんでした。

表(日付順不同)

id     date
-----  ----------
10500  2013-08-18
10501  2013-08-16
10502  2013-08-17
10503  2013-08-19
10504  NULL
10505  NULL
...
11800  NULL
11801  NULL

最新の日付を選択する( の開始点UPDATE

SELECT date
FROM my_table
ORDER BY date DESC
LIMIT 1

NULL日付の更新(動作しません)

UPDATE my_table
SET date = DATE_ADD((SELECT date FROM my_table ORDER BY date DESC LIMIT 1), INTERVAL 1 DAY)
WHERE date IS NULL
ORDER BY id ASC

どうすればこれを達成できますか? それとも、これは不可能ですか?

4

2 に答える 2

5

試す

UPDATE Table1 t1 JOIN
(
  SELECT id, @n := @n + 1 rnum
    FROM Table1 CROSS JOIN (SELECT @n := 0) i
   WHERE date IS NULL
   ORDER BY id
) t2 ON t1.id = t2.id CROSS JOIN
(
  SELECT MAX(date) date FROM Table1
) q
   SET t1.date = q.date + INTERVAL t2.rnum DAY

結果:

| | ID | 日付 |
----------------------
| | 10500 | 2013-08-18 |
| | 10501 | 2013-08-16 |
| | 10502 | 2013-08-17 |
| | 10503 | 2013-08-19 |
| | 10504 | 2013-08-20 | -- 日付が割り当てられました
| | 10505 | 2013-08-21 | -- 日付が割り当てられました

これがSQLFiddleのデモです

説明:エイリアス t2 を持つサブクエリでは、日付が NULL であるすべての行を取得しid、1 から始まる行番号を割り当てます。残念ながら、MySql にはROW_NUMBER()関数の実装がないため、ユーザー変数@nを使用して実行します。行が選択されます。この変数を初期化するには、サブクエリとエイリアスを使用しますiCROSS JOINサブクエリで使用できるようにするために使用しますt2。次に、同じ手法 ( CROSS JOIN) を使用して、テーブル内の最大日付を取得し、 内のすべての行で使用できるようにしますJOIN。すべてが揃ったら、日数を表す行番号を追加するだけです) それを最大日付に追加しdate、テーブルの列に割り当てます。

于 2013-08-15T16:23:13.020 に答える
1

join代わりに構文を使用します。

UPDATE my_table cross join
       (SELECT max(date) as maxdate FROM my_table) const
SET my_table.date = DATE_ADD(const.maxdate, INTERVAL 1 DAY)
WHERE my_table.date IS NULL;
于 2013-08-15T01:11:21.927 に答える