Таблица голосования MySQL, найдите самый последний голос каждого пользователя в записи и посчитайте на основе значения - PullRequest
4 голосов
/ 24 февраля 2011

Работая со структурой базы данных, я не создавал и надеялся на некоторую помощь по простому запросу MySQL.У меня есть таблица голосования votes с этими полями:

vote_id = уникальный идентификатор голосования

item_id = идентификатор записи, за которую проголосовали

voter_id= идентификатор участника, который вошел в голос

vote_date = дата голосования

vote = тип голосования (1 или 2)

Каждый пользователь может голосовать несколько раз за запись на сайте, указанную item_id.Они могут поставить 1 голос, который является «подобным», или 2, что «непохожий».Каждый раз, когда они голосуют, создается новая запись.Я хотел бы иметь возможность найти самое последнее значение vote для каждого пользователя в определенном item_id, а затем иметь возможность фактически СУММАТЬ или СЧИТАТЬ столбец голосования, ЕСЛИ значение голосования является «подобным» (значение 1)

Например,

vote_id   item_id   voter_id   vote_date     vote
60        9         27         1273770151    1
153       9         45         1274896188    1
163       9         3          1274918584    1
164       9         3          1275021495    2
1051      9         181        1290839090    1

Я хочу получить новейшие значения vote для каждого пользователя, а затем подсчитать, сколько голосов набрано 1.В этом случае # будет 3

27  = 1
45  = 1
3   = 2
181 = 1
      3

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

Спасибо за любую помощь в этом.Я сделал все возможное, чтобы найти ответ на этот вопрос, но ничего не было правильно.

Очень признателен.

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

[EDIT:] Я добавил значения (1052, 10, 3, 1290839091, 1), чтобы лучше решить проблему, и мне пришлось добавить «item_id» в подзапрос, который извлекает новейшие голоса.


Ууу!В конце концов, на вопрос stackoverflow я действительно могу ответить !!!Я бродил в течение недели в поисках чего-то короткого и сладкого в моем переулке.Спасибо за забавную проблему SQL!

Сначала вам нужно извлечь новейших голосов.Комбинация (voter_id, item_id, voice_date) лучше быть уникальной для этого подхода к работе!

SELECT
  voter_id, item_id, MAX(vote_date) AS vote_date
FROM
  votes
GROUP BY
  voter_id, item_id

Результаты:

+----------+---------+------------+
| voter_id | item_id | vote_date  |
+----------+---------+------------+
|        3 |       9 | 1275021495 |
|        3 |      10 | 1290839091 |
|       27 |       9 | 1273770151 |
|       45 |       9 | 1274896188 |
|      181 |       9 | 1290839090 |
+----------+---------+------------+

А затем вам нужно присоединиться к исходной таблице против этихРезультаты.Дополнительный выбор сделает работу.Обратите внимание, как запрос выше скопирован и вставлен в объединение ниже, но теперь ему присваивается имя «tmp»:

SELECT
  v.*
FROM (
  SELECT
    voter_id, item_id, MAX(vote_date) AS vote_date
  FROM
    votes
  GROUP BY
    voter_id, item_id
  ) tmp
INNER JOIN
  votes v ON (     v.vote_date = tmp.vote_date
               AND v.voter_id  = tmp.voter_id
               AND v.item_id   = tmp.item_id
  )

Результаты:

+---------+---------+----------+------------+------+
| vote_id | item_id | voter_id | vote_date  | vote |
+---------+---------+----------+------------+------+
|      60 |       9 |       27 | 1273770151 |    1 |
|     153 |       9 |       45 | 1274896188 |    1 |
|     164 |       9 |        3 | 1275021495 |    2 |
|    1051 |       9 |      181 | 1290839090 |    1 |
|    1052 |      10 |        3 | 1290839091 |    1 |
+---------+---------+----------+------------+------+

Я надеюсь, вы знаете, чтоделать отсюда .... о черт возьми, я не могу с собой поделать, это слишком мило:

SELECT
  v.item_id, SUM(2 - v.vote) AS likes, SUM(v.vote - 1) AS dislikes
FROM (
  SELECT
    voter_id, item_id, MAX(vote_date) AS vote_date
  FROM
    votes
  GROUP BY
    voter_id, item_id
  ) tmp
INNER JOIN
  votes v ON (     v.vote_date = tmp.vote_date
               AND v.voter_id  = tmp.voter_id
               AND v.item_id   = tmp.item_id
  )
GROUP BY
  v.item_id

Результаты:

+---------+-------+----------+
| item_id | likes | dislikes |
+---------+-------+----------+
|       9 |     3 |        1 |
|      10 |     1 |        0 |
+---------+-------+----------+
0 голосов
/ 24 февраля 2011

Не уверен, вопрос, это то, что вы ищете?

SELECT COUNT(*) FROM votes WHERE vote = '1' AND item_id = '9'

...