MYSQL извлекает, был ли последний запрос обновлением или вставкой


Я работаю над рейтинговой системой в PHP и MYSQL с голосами вверх и голосами вниз.

У меня есть база данных под названием votes, которая содержит все голоса, поданные зарегистрированными пользователями (1 для голосования "за" и -1 для голосования "против") Для каждого сообщения, которое может быть оценено, приводится краткое изложение всех голосов "за", "против", а также итогового голосования ("за" минус "против").

Когда кто-то голосует за публикацию, появляется запрос INSERT ... ON DUPLICATE KEY UPDATE, который вставляет или обновляет таблицу, содержащую все голоса. Затем я обновляю сообщения строятся с новым количеством голосов "за", "против", а также с новыми чистыми голосами.

Моя проблема в том, что мне нужно знать, был ли первый запрос вставкой или обновлением, потому что, если это обновление, мне нужно будет вычесть старый голос и добавить новый, но id это просто вставка, мне не нужно ничего вычитать и просто увеличивать количество голосов.

Author: Joris Blanc, 2012-07-22

2 answers

Я бы посоветовал вам не оптимизировать подсчет голосов преждевременно, и после каждого нового голосования за какой-либо пост вы просто пересчитываете все голоса за этот пост, независимо от того, было ли это INSERT или UPDATE, что вызвало пересчет. Затем сохраните результат в БД.

Более того, проще выбросить даже кэширование общего количества голосов и вычислять их на лету, когда вам нужно.

Только когда вы сталкиваетесь с проблемами производительности, вам следует измерить свои расходы и проверить, что узкое место. Скорее всего, подсчет голосов не должен быть первым, что нужно оптимизировать в вашем приложении.

Сделайте свою жизнь проще.

 2
Author: spacediver, 2012-07-22 18:06:29

Предполагая, что у вас есть PRIMARY KEY на столе, вы могли бы сделать это:

SET @last_insert_id := IFNULL(LAST_INSERT_ID(), 0);

INSERT ... ON DUPLICATE KEY UPDATE ...

SELECT IFNULL(LAST_INSERT_ID(), 0) <> @last_insert_id AS inserted;

Если inserted ИСТИННО, запись была вставлена, если ЛОЖНО, существующая запись была обновлена.

Конечно, этот код предполагает, что первый LAST_INSERT_ID() не был установлен из вставки в другую таблицу.

 2
Author: Ross Smith II, 2012-07-22 18:30:48