检测更新中找到的行

时间:2015-01-27 14:27:42

标签: php mysql

我目前有以下两个问题:

UPDATE `forum_subscriptions` SET `unread`=0 WHERE `userid` = ? AND `threadid` = ?;

SELECT `id` FROM `forum_subscriptions` WHERE `userid` = ? AND `threadid` = ?;

这感觉不太理想。

我知道我可以使用“受影响的行”来查找UPDATE已修改的行数,但如果unread已经为零,则“受影响的行”将为零,即使排找到了。

第二个查询的唯一目的是查找该行是否存在。

有没有办法找出UPDATE查询找到行,而不是更新一行?

2 个答案:

答案 0 :(得分:0)

来自文档:

  

对于UPDATE语句,默认情况下受影响的行值为   实际更改的行数。如果指定 CLIENT_FOUND_ROWS   当连接到mysqld时,标记为 mysql_real_connect()   affected-rows value是“找到”的行数;也就是说,匹配   WHERE子句。

如果您可以使用两个单独的连接(一个用于找到的行,一个用于受影响的行),那么您可以按如下方式设置连接:

使用 mysqli ,您提供MYSQLI_CLIENT_FOUND_ROWS作为$flags的最后一个参数(real_connect()):

$dbh = mysqli_init();
$dbh->real_connect('host', 'username', 'password', 'db', '3306', null, MYSQLI_CLIENT_FOUND_ROWS);

使用 PDO ,在您提供的options数组中提供PDO::MYSQL_ATTR_FOUND_ROWS作为构造函数的最后一个参数。

$dbh = new PDO('mysql:dbname=database;host=host', 'username', 'password', [PDO::MYSQL_ATTR_FOUND_ROWS => true]);

答案 1 :(得分:0)

我一直在寻找一种无需修改ROW_COUNT()行为的方法。基于this answer的类似问题,这是我想出的内容:

SET @temp=0;
UPDATE `forum_subscriptions` SET `unread`=IF(@temp:=@temp+1,0,0) WHERE `userid` = ? AND `threadid` = ?;
SELECT @temp;