MySQL Получение результатов для конкретного пользователя

0

У меня есть следующий запрос, который работает так, как ожидалось.

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           
  • 0
    так вы хотите ранжировать все события от одного пользователя? или посмотреть, как эти события определяют место среди всех событий ?? Пожалуйста, включите некоторые образцы данных и ожидаемый результат.
Теги:
select
join

1 ответ

1
Лучший ответ

Давайте забудьте о ранге на мгновение, если вы хотите только одно событие от одного конкретного пользователя:

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

РЕДАКТИРОВАТЬ:

для фильтрации для одного пользователя вам нужен другой подзапрос.

  1. подсчитывать голоса
  2. рассчитывать ранги
  3. фильтровать пользователя

Таким образом, запрос становится:

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'
  • 0
    На самом деле извините, я думаю, что вы неправильно меня поняли, я хочу вернуть общий рейтинг. Вопрос был обновлен.
  • 0
    Тем не менее, мой оригинальный запрос, кажется, работает, спасибо в любом случае.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню