MySQL: извлечение голоса текущего пользователя по запросу ссылок - PullRequest
0 голосов
/ 03 декабря 2009

Итак, у меня есть этот запрос, который извлекается из моей таблицы ссылок и голосов, и мне нужен последний столбец данных. Моя таблица голосов состоит из голосов каждого пользователя, пользователь может голосовать только один раз за ссылку, и его значение голосования равно -1, 0 или 1. В таблице голосов есть внешний ключ user_id, и я хочу каким-то образом собрать голос текущего пользователя , Я чувствую, что сложность текущего запроса может потребовать второго запроса, но я действительно хочу избежать этого, если это возможно. Мне просто нужно знать, каким был текущий голос пользователя. Ссылка никогда не будет иметь более одного значения голоса, потому что пользователь может голосовать по ссылке только один раз.

Несколько заметок

  1. Все ссылки начинаются автоматически при наличии хотя бы одной записи о голосовании текущего пользователя
  2. Пользователь, который голосует по ссылке, затем отменяет выбор этого голосования, сохраняет эту запись голосования с 0 дельта

SQL:

SELECT links.*, (SUM(votes.karma_delta)) AS karma
FROM links, votes
WHERE links.id = votes.link_id
GROUP BY votes.link_id
ORDER BY (SUM(votes.karma_delta) - 1) / POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5) DESC
LIMIT 0, 100

Хотя оптимизация великолепна, сейчас я просто хочу получить выбранные ссылки karma_delta указанным пользователем.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2009

Я действительно не уверен в том, что вы спрашиваете, но похоже, что вы хотите сохранить информацию, которую вы уже возвращаете, и просто дополнить ее суммой голосов, относящихся к текущему пользователю по каждой ссылке.

Если это так, то что-то вроде этого должно сделать:

SELECT links.*, 
       SUM(votes.karma_delta) AS karma,
       SUM(
           IF(votes.user_id = current_user_id, 
              votes.karma_delta, 
              0)
          ) AS user_vote
FROM links, votes
WHERE links.id = votes.link_id
GROUP BY votes.link_id
ORDER BY (SUM(votes.karma_delta) - 1) / 
         POW(
              TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2, 
              1.5
            ) DESC
LIMIT 0, 100 
0 голосов
/ 03 декабря 2009

Вот один из способов сделать это быстрее: если вам нужно часто показывать оценки по каждой из ссылок, и вы не очень часто голосуете по ссылкам, я бы денормировал структуру данных следующим образом:

  • Создать столбец в таблице ссылок под названием «текущий счет»
  • Всякий раз, когда вы вносите изменения в таблицу голосов, также обновляйте текущий счет
  • Если вы когда-нибудь беспокоитесь о том, что два из них не синхронизированы, запустите демон, который переопределяет значения текущего счета с «агрегацией всех голосов».

Тогда показ каждой из ссылок является мега-быстрым; Конечно, вы платите за это во время голосования (вы делаете две вставки / обновления вместо одной), а также за дополнительную сложность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...