2011-09-15 46 views
0

我试图构建一个'新评论'功能,其中用户显示自上次访问以来的新评论数。 我构建了一个包含主题ID,用户ID和时间戳的“视图”表。每次用户访问该主题或插入新行(如果不存在时),更新时间戳的最佳方式是什么?目前我有:MySQL REPLACE rows WHERE字段a等于x且字段b等于y

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

但是,这是行不通的。是否可以在一个查询中做到这一点?

回答

1

尝试用VALUES代替SET。语法是:

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' 

(当然,你应该用正确的占位符,所以小博表不作一游和摧毁你的数据库)

+0

我试过第二个,它只是添加行而不是替换。我也尝试过“在DUPLICATE KEY UPDATE MemberID ='$ _SESSION [SESS_MEMBER_ID]',TopicID ='$ threadid'”。 – Miles

+0

@Miles:您需要将这两个设置为桌面上的组合唯一键。然后,如果尝试插入具有相同唯一键的行,它将更新'Visited'的值而不是抛出错误。 – CanSpice

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."')"); 
?> 

这将总共运行两个查询。

0

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

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

而使用存储过程意味着只有一次去DB。

+0

所以你说最好有多个查询,一个查看它是否存在,然后是一个更新,如果它没有,并插入,如果它不存在?我可以用if ... else来做到这一点,但我认为如果有一种方法可以在一个查询中执行,效率会更高 – Miles

相关问题