MySQL REPLACE行WHERE字段a等于x,字段b等于y

时间:2011-09-15 22:56:46

标签: php mysql replace where

我正在尝试构建一个“新评论”功能,向用户显示自上次访问以来新评论的数量。 我构建了一个'Views'表,其中包含主题id,用户ID和时间戳。每次用户访问该主题或插入新行(如果不存在)时,更新时间戳的最佳方法是什么?目前我有:

REPLACE INTO Views (MemberID, TopicID, Visited)
SET ('$_SESSION[SESS_MEMBER_ID]', '$threadid', '$t')
WHERE MemberID = $_SESSION[SESS_MEMBER_ID] AND TopicID = $threadid

然而,这不起作用。是否可以在一个查询中执行此操作?

3 个答案:

答案 0 :(得分:1)

尝试将SET替换为VALUES。语法是:

REPLACE [LOW_PRIORITY | DELAYED]
  [INTO] tbl_name [(col_name,...)]
  {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

修改:请注意,只有将MemberIDTopicID设置为表格中的唯一键时,才能生效。如果你这样做,那么你应该能够做到:

REPLACE INTO Views (MemberID, TopicID, Visited)
VALUES ('$_SESSION[SESS_MEMBER_ID]', '$threadid', '$t')

INSERT INTO Views (MemberID, TopicID, Visited)
VALUES ('$_SESSION[SESS_MEMBER_ID]', '$threadid', '$t')
ON DUPLICATE KEY UPDATE Visited = '$t'

(当然,你应该使用适当的占位符,所以Little Bobby Tables不会访问并破坏你的数据库)

答案 1 :(得分:0)

我想不出只有一个查询的方法,但你可以试试这个:

<?php
$where = "where `MemberID`=".$_SESSION['SESS_MEMBER_ID']." and `TopicID`=".$threadid;
if( mysql_fetch_assoc( mysql_query( "select * from `Views` ".$where)))
   mysql_query( "update `Views` set `Visited`='".$t."' ".$where);
else
   mysql_query( "insert into `Views` (`MemberID`, `TopicID`, `Visited`) values ('".$_SESSION['SESS_MEMBER_ID']."', '".$threadid."', '".$t."')");
?>

这将总共运行两个查询。

答案 2 :(得分:0)

如果您使用的是TIMESTAMP数据类型,则每次更改行时它都会自动更新。因此,只需在行上调用update(如果存在,否则创建它)并仅更改topicId。数据库将处理更改时间。

真的,我不会使用REPLACE。相反,也许您可​​以创建一个存储过程来检查该行是否存在(只传递memberId和topicId),如果没有则创建它,然后将时间戳返回给您。这更有意义。

使用存储过程只意味着一次访问数据库。