簡體   English   中英

在一個查詢中選擇更新

[英]select with update in one query

我有一個查詢,如:

SELECT id, name, surname, fromId, toId, msg_text, readed FROM messages WHERE toId = 2;

所以我想update all selected rows.readed = 1 並且查詢必須返回所有選定的行。

如果可能,這些操作必須在一個查詢中執行。

對不起我的英語不好

您只能使用UPDATE查詢進行更新。 UPDATE查詢只能返回一件事:即受影響的行數。 因此,您無法在單個查詢中更新和選擇所需的值。

在這里看看更新表,然后在mySQL中返回更新的行

簡短答案:不,不可能在單個查詢中。

簡短的回答要少一些:有一種稱為命令查詢分離的方法,簡而言之,它表明命令應該執行某些操作並且不返回任何內容,而查詢則不執行任何操作並返回任何結果。 如果您打算構建良好的軟件,我建議遵循此原則。

我不會說為什么這不可能,因為我自己不是SQL專家那么多,我只能猜測,但我建議您解決問題的簡單方法。

當您得到結果時,您很可能用PHP處理它們。 假設結果按升序排序-在第一個迭代中獲取最小ID,在最后一個迭代中獲取最大ID,然后運行更新查詢:

UPDATE messages SET readed = 1 WHERE toId = ? AND (id >= <minimum id> AND id <= <maximum id>)

附帶說明-名稱和姓氏可能不是您要存儲在消息表中的名稱。

您可以使用存儲過程來做到這一點。 創建一個存儲過程,該存儲過程也執行更新和選擇。 例如:

DROP PROCEDURE IF EXISTS myproc;
delimiter //
CREATE PROCEDURE myproc()
begin
 set @qry='select id, name, surname, fromId, toId, msg_text, readed from messages where toId = 2';
 prepare query from @qry;
 execute query;
 update messages set readed=1 where toId = 2;
end //

然后,您可以通過此過程運行查詢。 例如:

$sql = "call myproc()";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
    }
} else {
    echo "0 results";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM