我目前有以下两个问题:
UPDATE `forum_subscriptions` SET `unread`=0 WHERE `userid` = ? AND `threadid` = ?;
和
SELECT `id` FROM `forum_subscriptions` WHERE `userid` = ? AND `threadid` = ?;
这感觉不太理想。
我知道我可以使用“受影响的行”来查找UPDATE
已修改的行数,但如果unread
已经为零,则“受影响的行”将为零,即使排找到了。
第二个查询的唯一目的是查找该行是否存在。
有没有办法找出UPDATE
查询找到行,而不是更新一行?
答案 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;