|
我在尝试着
# 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表中的列即可。 |
|