MySQL заменяет строки, где поле a равно x, а поле b равно y - PullRequest
0 голосов
/ 16 сентября 2011

Я пытаюсь создать функцию «новых комментариев», где пользователю показывается количество новых комментариев с момента последнего посещения. Я создал таблицу «Views», которая содержит идентификатор темы, идентификатор пользователя и временную метку. Как лучше всего обновлять отметку времени каждый раз, когда пользователь посещает эту тему, или вставлять новую строку, если она не существует? На данный момент у меня есть:

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

Однако это не работает. Возможно ли сделать это одним запросом?

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

Попробуйте заменить SET на VALUES. Синтаксис:

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

Редактировать: Обратите внимание, что это действительно работает, только если вы установили MemberID и TopicID в качестве уникального ключа в своей таблице. Если вы сделаете это, то вы должны просто сделать следующее:

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 не посещал и не разрушал вашу базу данных)

0 голосов
/ 16 сентября 2011

Если вы используете тип данных TIMESTAMP, он будет обновляться автоматически каждый раз при изменении строки.Поэтому просто вызовите update для строки (если она существует, в противном случае создайте ее) и измените только topicId.База данных будет обрабатывать изменение времени.

Действительно, я бы не использовал REPLACE.Вместо этого, возможно, вы могли бы создать хранимую процедуру, которая проверяет, существует ли строка (просто передайте memberId и topicId) и создает ее, если нет, а затем возвращает вам метку времени.Это имеет больше смысла.

А использование хранимых процедур означает только одну поездку в БД.

0 голосов
/ 16 сентября 2011

Я не могу придумать способ только с одним запросом, но вы можете попробовать это:

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

Всего будет выполнено два запроса.

...