2011-09-15 49 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

相關問題