在一个查询中选择更新

时间:2016-06-12 10:09:14

标签: php mysql sql mysqli

我有一个类似的查询:

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

所以我想update all selected rows.readed = 1。并且Query必须返回所有选定的行。

如果可能,这些操作必须在一个查询中执行。

抱歉我的英文

3 个答案:

答案 0 :(得分:1)

您只能使用UPDATE查询进行更新。 UPDATE查询只能返回一件事:即受影响的行数。因此,您无法在单个查询中更新和选择所需的值。

在这里查看Update a table then return updated rows in mySQL

答案 1 :(得分:1)

简短回答:不,在单个查询中不可能。

一个简短的回答:有一种称为命令查询分离的东西,简而言之就是命令应该做某事并且什么也不返回,而查询应该什么都不做并返回一些东西。如果你打算建立一个好的软件,我建议遵循这个原则。

我不会理解为什么这是不可能的,因为我自己并不是一个SQL大师,我只能猜测,但我会建议一个简单的解决方案来解决你的问题。

当您获得结果时,您最有可能在PHP中处理它们。假设结果按升序排序 - 在第一次迭代时获取最小id,在最后一次获取最大id,然后运行更新查询:

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

在旁注中 - 姓名和姓氏可能不是您要存储在消息表中的内容。

答案 2 :(得分:0)

您可以使用存储过程执行此操作。 创建一个执行更新和选择的存储过程。 例如:

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";
}