[英]Update multiple rows from same table in mysql
根據同一表中的數據更新多行上的單個列。
update table1 set status=newtime
from (
select
case
when TIME_FORMAT( TIMEDIFF( ADDTIME( time_val, '120:00:00' ), NOW() ), '%Hh %im %ss')<0 then '4'
else '0'
end as newtime,
id as new_id
FROM table1
where id2='2'
and status='0'
)
where id=new_id
這是我的查詢。 提前致謝。
編輯:
這是實現此目的的替代查詢。 但它也給了我一個錯誤
update table1 set status=
(select
case when timeleft<0 then '4' else '0' end as something,
new_id
from
(
select
TIME_FORMAT( TIMEDIFF( ADDTIME( time_val, '120:00:00' ), NOW() ), '%Hh %im %ss') as newtime,
id as new_id
FROM
table1
where id2='2' and
status='0'
)
}
where id=new_id
“#1248 - 每個派生表都必須有自己的別名”。
我無法使用別名,因為我正在從查詢中獲取兩列。 任何幫助都會很棒。
UPDATE
語句在 MySQL 語法中沒有FROM
子句。 但是,您可以針對子查詢JOIN
table
。
UPDATE
table1 t1
JOIN (
select
case
when TIME_FORMAT( TIMEDIFF( ADDTIME( time_val, '120:00:00' ), NOW() ), '%Hh %im %ss')<0 then '4'
else '0'
end as newtime,
id as new_id
FROM table1
WHERE id2='2' AND status='0'
) tsub ON t1.id = tsub.new_id
SET status = tsub.newtime
在我看來,您根本不需要進行任何子查詢或加入。 這應該做你想做的:
UPDATE table1
SET status = CASE WHEN TIME_FORMAT(TIMEDIFF(ADDTIME(time_val, '120:00:00'), NOW()), '%Hh %im %ss') < 0 THEN '4' ELSE '0' END
WHERE id2 = '2' AND status = '0'
在您編寫的查詢中,您的子查詢將返回新的time_val
和要更新的行的 id 號,對於任何符合條件id2 = '2' AND status = '0'
。 然后,您將更新所有這些行(符合上述條件的行)並將status
設置為新的time_val
。
與其先選擇它們,不如去掉中間人,然后用新值更新與該條件匹配的所有行。 您的查詢將更快、更直接。
除了簡化版本(由@Travesty3 提供)之外,您似乎正在使用一大堆日期和時間函數來測試一個簡單的事情:
UPDATE table1
SET status = '4'
WHERE id2 = '2'
AND status = '0'
AND time_val < NOW() - INTERVAL 120 HOUR
我們可以通過同一個表或兩個不同的表以這種方式更新多行表,只需從我的程序中發布一段 mysql 代碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.