У меня есть следующий запрос, который работает так, как ожидалось.
SELECT T.*, @curRank := @curRank + 1 AS rank
FROM ( SELECT e.guid,
e.name,
(SELECT COUNT(ev.event_vote_id)
FROM event_vote ev
WHERE ev.event_uid = s.guid) AS votes
FROM event e
) as T
CROSS JOIN (SELECT @curRank := 0) r
ORDER BY votes DESC
Он возвращает указатель, имя, количество голосов и рейтинг всех событий.
Однако я хочу сделать его конкретным для определенного пользователя, связав таблицу user_event, используя что-то вроде следующего:
JOIN user_event ON t.guid = ue.event_uid
WHERE ue.user_uid = 'abc123'
Однако я не уверен, где это поставить или если это.
У меня есть следующий запрос как начало, но он возвращает точно противоположное ожидаемому, т.е. каждое событие, не принадлежащее пользователю.
SELECT t.*
FROM user_event ue
JOIN ( SELECT e.guid,
e.name,
e.ownerId,
e.thumbnailSrc,
@curRank := @curRank + 1 AS rank,
( SELECT COUNT(ev.event_vote_id)
FROM event_vote ev
WHERE ev.event_uid = e.guid) AS votes
FROM event e, (SELECT @curRank := 0) r
) AS t
ON t.guid = ue.event_uid
WHERE ue.user_uid = 'abc123'
ORDER BY rank ASC
Ожидаемые результаты
список всех событий:
guid | name | votes | rank
def test2 2 1 (user1)
abc test1 1 2 (user2)
ghi test3 0 3 (user1)
jkl test4 0 4 (user3)
что запрос должен вернуть для пользователя 1 (user1 guid abc123)
guid | name | votes | rank
def test2 2 1
ghi test3 0 3
Давайте забудьте о ранге на мгновение, если вы хотите только одно событие от одного конкретного пользователя:
SELECT e.*, ue.*, ( ... ) as votes
FROM event e
JOIN user_event ue
ON e.guid = ue.event_uid
WHERE ue.user_uid = 'abc123'
И над этим результатом вы можете сделать ранжирование.
SELECT T.*, @curRank := @curRank + 1 AS rank
FROM ( ... previous query ... ) as T
CROSS JOIN (SELECT @curRank := 0) r
ORDER BY votes DESC
РЕДАКТИРОВАТЬ:
для фильтрации для одного пользователя вам нужен другой подзапрос.
Таким образом, запрос становится:
SELECT *
FROM ( SELECT T.*, @curRank := @curRank + 1 AS rank
FROM ( SELECT e.*, ue.*, ( ... ) as votes
FROM event e
JOIN user_event ue
ON e.guid = ue.event_uid ) as T
CROSS JOIN (SELECT @curRank := 0) r
ORDER BY votes DESC
) as ranked_result
WHERE ranked_result.user_uid = 'abc123'