回答

收藏

MySQL查询以增加日期更新记录

技术问答 技术问答 59 人阅读 | 0 人回复 | 2023-09-13

我在尝试着
# d9 r" L2 I9 M5 J5 W[ol]获取数据库中的最新日期,以及 - H8 ]- F1 z" M( P1 Y
根据该日期更新具有日期的每条记录,将NULL日期增加1天。, `$ o: E" {. K* e2 ~
[/ol]
/ Y. |, O, j8 K8 q我可以使用下面的“ 最新日期” 查询来获取最新日期。我首先需要执行此操作,因为表中的日期 不正确7 p, S( E6 [6 m: t, w' I( V
。如果需要,我可以运行此查询,手动将其写下来,然后UPDATE根据该日期运行查询。我希望在没有手动过程的情况下运行所有??内容。  _0 G' d7 Y6 w8 h$ B# A
问题底部的最后一个查询是我的 测试查询, 用于尝试更新日期,但是我没有运气使其工作。
2 j, G7 A# n% f# c9 a表(日期不正确)
2 F- `' X7 _9 N. G5 u" Zid     date
4 v) z% v" ]2 v9 V; t-----  ----------- {$ ^7 T+ u5 Y9 L
10500  2013-08-18( K* @+ R( h" T( [
10501  2013-08-16
+ y1 ~  {1 ]8 a' C9 V1 Q; }. l10502  2013-08-174 s* j- H5 @2 [1 }. z
10503  2013-08-19
: S1 s- q: Z: l" v: L9 O10504  NULL6 G; z: H1 A6 f/ w2 W
10505  NULL1 _  P8 {% Z4 U  Z6 M
...
4 H# N) f: |8 W2 s11800  NULL
# Y1 [3 G( z& e11801  NULL) E; i# Q7 d3 O- b8 T
选择最晚日期(从的起点UPDATE)  X, u  f' o1 K4 Z7 |; G( b2 G+ h
SELECT date
" N' O3 v& T& n& g9 u- @/ EFROM my_table
9 g; c5 b  Q) _4 o: t$ B4 NORDER BY date DESC2 W0 k8 [' [1 l! M4 Z/ F, w2 E4 C" N
LIMIT 1
1 _4 h/ M: ]9 o$ o* L更新NULL日期( 无效 )
% U2 i5 J+ _* }8 Y4 q% |( uUPDATE my_table7 \/ M8 }9 V! c9 u: K9 O
SET date = DATE_ADD((SELECT date FROM my_table ORDER BY date DESC LIMIT 1), INTERVAL 1 DAY)! U9 E( x% g" {- C  I* J
WHERE date IS NULL
! d3 ]0 Y; B+ ], m7 [9 _' F. lORDER BY id ASC1 B  n& \+ E$ R7 `$ K% |
我该怎么做?还是不可能?3 p0 s' h  L8 v0 c9 U
                : H" L3 \+ v" k7 M5 R7 J
解决方案:: Z' V: v, l8 \  j; O" p4 q
                / H$ l2 U5 B; I, r+ W8 h
4 ?% G- f9 [5 K8 n

& Y; B$ w2 ~$ c% I) S3 M! e                尝试
" `. Q: _  c+ v* nUPDATE Table1 t1 JOIN
: |) g( a8 P+ w% M(6 \  n! e* r% R% B% o
  SELECT id, @n := @n + 1 rnum
, o- V, m9 C9 C. X4 n4 g    FROM Table1 CROSS JOIN (SELECT @n := 0) i8 k/ D. z. e. Q
   WHERE date IS NULL3 i/ j' n+ ^* H9 b% V& z
   ORDER BY id
* ^$ Y9 L: U+ V1 }8 Z2 M) t2 ON t1.id = t2.id CROSS JOIN
: I, t) o; ]$ F(
' O' {; X7 F0 |& X2 y) X" F" {# T  SELECT MAX(date) date FROM Table16 J. X, u. v: [4 x6 F
) q
' F" K% r8 |, y/ W6 [0 }   SET t1.date = q.date + INTERVAL t2.rnum DAY! e% W; M, l. k2 }+ B
结果:
; `; n# J3 Z3 \| ID | DATE |) x0 w7 Y7 B% z0 i
----------------------
! e( ~. A) x, [$ A5 r1 o. c| 10500 | 2013-08-18 |$ H* B( ^1 N: ~" Y
| 10501 | 2013-08-16 |. S+ N4 I+ J' D6 {6 p
| 10502 | 2013-08-17 |
; ^# U# c- t6 |0 z" K$ S| 10503 | 2013-08-19 |
# q$ M6 O* a; Y| 10504 | 2013-08-20 | -日期已分配- e+ b' ~* @. [; B
| 10505 | 2013-08-21 | -日期已分配
' J- ]5 J- ^" J这是 SQLFiddle 演示
& t! k  |$ d' \5 L3 C" Y  G说明:. P& ?- |! ?2 f: o. w* b/ V
在别名为t2的子查询中,我们捕获日期为NULL的所有行,id并按从1开始的行号进行赋值。不幸的是,MySql没有ROW_NUMBER()函数的实现,因此我们使用用户变量@n来实现,该用户变量在行被选中。要初始化此变量,我们使用带有别名的子查询i。并用于CROSS9 A" q. G; q! Y& F5 V% F4 j
JOIN使其可用于我们的子查询t2。然后,我们使用相同的技术(CROSS
+ j! _' q) w1 IJOIN)来获取表格中的最大日期,并使该日期可用于我们表格中的每一行JOIN。一旦有了所有这些,我们只需添加一个行号(代表天数),然后将其添加到最大日期并分配给date表中的列即可。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则