2012-09-28 42 views
0

這是我希望做單獨使用MySQL:(不PHP)如何在MySQL中實現這個?

PHP代碼:

$result=mysql_query("select f2 from t1 where f1=constant limit L"); 

while($data = mysql_fetch_row($result)) 
    mysql_query("update t2 set f4=f4-1 where f3={$data[0]} limit 1"); 

如果你不知道PHP:

select f2 from t1 where f1=constant limit L; 

for each f2 (from above result) as F: 
    update t2 set f4=f4-1 where f3=F limit 1; 

如何實現這個在MySQL中?

詳情:

可以有第一選擇的輸出重複值,併爲每個重複的,UPDATE語句將被運行。因此,如果在第一次選擇的輸出中值123發生三次,那麼f4將更新爲f4-3,其中f3 = 123。

'L'是表't1'中「f1 =常數」條件滿足的次數;這個數字在被用作限制之前是已知的。

使用限制1,因爲字段'f3'中的值是唯一的。

回答

1

使用此查詢,並提供缺少的參數:

UPDATE t2 SET f4 = f4 - 1 

WHERE f3 IN (SELECT f2 FROM t1 WHERE f1 = ? LIMIT ?); 

如果你想有t2.f4修改每一行中f2是匹配(因爲f2.t1不是唯一的),那麼這應該工作:

UPDATE t2, t1 SET t2.f4 = t2.f4 - 1 
WHERE t2.f3 = t1.f2 
    AND t1.f1 = ?; 
+0

如果括號內的select語句給出重複的值,那麼將更新每個重複值? – gom

+0

如何告訴MySQL在這裏,對於每個「在哪裏」,它將在t2中只發現一條記錄? (正如我在我的問題中所做的那樣) – gom

+0

@ user1444680如果't2.f3'上有唯一索引,那麼在更新上不需要'LIMIT'子句,因爲每個值只能更新一行。 WHERE ... IN'將忽略子查詢中的重複值,但如果這讓你感覺更好,可以將子查詢更改爲「SELECT DISTINCT」。 (這種改變不會改變查詢的行爲。) – cdhowie