2009-09-16 3 views
1

J'ai un système plus/moins où un utilisateur peut en ajouter un ou moins d'un article de blog.Mise à jour de l'horodatage dans la table avec REPLACE INTO

Ma base de données Table (MySQL) ressemble à ceci: userid identifiant d'entrée vote - qui est +1 ou -1 timeStamp

J'ai mis le timestamp par défaut CURRENT_TIMESTAMP.

J'ai les méthodes plus() et moins(). Les deux font la même chose mais on insère +1 dans "vote" et l'autre insère -1. Puisque (userid, entryid) est la clé primaire, j'utilise REPLACE INTO. INSERT INTO affiche une erreur de duplication. INSERT IGNORE ne laisse pas le changement d'utilisateur à voter à +1 -1

"REPLACE INTO votes(userid, entryid, vote) VALUES(:uid,:eid, -1)"; 

Ignorer les valeurs ..

Alors que REPLACE INTO fonctionne parfaitement, je commande par l'horodatage, alors quand quelqu'un clique +1 une seconde fois après avoir voté, il met à jour l'horodatage, ce qui le place en haut de la liste.

Quelqu'un connaît une solution à cela?

ps Désolé pour le mauvais titre. Je ne pouvais pas penser à un approprié.

Répondre

5

Utilisation du INSERT ... ON DUPLICATE KEY UPDATE Syntax de MySQL, vous pouvez effectuer la ligne de contrôle, et seulement mettre à jour l'horodatage si le vote réellement changé:

INSERT INTO 
    votes 
SET 
    userid = :uid, 
    entryid = :eid, 
    vote = :vote, 
    timeStamp = NOW() /* I'm being explicit here -- you don't need this */ 
ON DUPLICATE KEY UPDATE 
    vote = :vote, 
    timeStamp = IF(vote = :vote, timeStamp, NOW()) 
+1

vous n'avez pas besoin de référencer la colonne d'horodatage du tout depuis l'horodatage est seulement mis à jour si la ligne est réellement mise à jour. si le vote est le même, il n'y a pas de changement et la colonne timestamp n'est pas mise à jour. – longneck

Questions connexes