[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 |
+---------+-------+----------+