將1新增到欄位

Add 1 to a field

來源: link 標籤:phpmysql 更新時間:

  問題

如何將以下2個查詢轉換為1個查詢

 $sql    = "SELECT level FROM skills WHERE id = $id LIMIT 1;";
$result = $db->sql_query($sql);
$level  = (int) $db->sql_fetchfield('level');
$db->sql_freeresult($result);

++$level;

$sql    = "UPDATE skills SET level = $level WHERE id = $id;";
$result = $db->sql_query($sql);
$db->sql_freeresult($result);
 

我在phpBB mod中使用它,但要點是我抓住級別,新增一個然後更新,如果我可以作為一個查詢執行它,似乎會更容易和更快.

編輯:$id已經被迫成為整數,因此這次不需要逃避.

  最佳答案

我得到這個模式嗎?

 $sql = "UPDATE skills SET level = level+1 WHERE id = $id";
$result = $db->sql_query($sql);
$db->sql_freeresult($result);
 

在 Teifion 的特定情況下,phpBB DDL 將特定欄位列為 NOT NULL,因此沒有遞增 NULL 的危險。

在一般情況下,你不應該使用NULL來表示零.遞增NULL應該給出NULL的答案.如果你是一種錯誤的開發人員,認為NULL = 0,離開鍵盤並找到另一個消遣時間,你只是在為我們其他人努力生活.當然,這是計算機產業,我們是誰說你錯了?如果你不錯,使用

 $sql = "UPDATE skills SET level = COALESCE(level,0)+1 WHERE id = $id";
 

但是讓我們面對這個問題:你錯了。如果每個人從0級開始,那麼你的DDL應該包括

 level INT DEFAULT '0' NOT NULL
 

如果程式設計師在建立記錄時忘記設定它.如果不是每個人都從級別0開始,那麼跳過DEFAULT並強制程式設計師在建立時提供值.如果有些人超級,對他們來說,級別是毫無意義的事情,那麼將一個新增到他們的級別就沒有意義.在這種情況下,從DDL中刪除NOT NULL.

  相同標籤的其他問題

phpmysql