MySQL Выберите, чтобы создать рейтинг на основе количества записей в таблице ... как это сделать? - PullRequest
2 голосов
/ 13 марта 2019

Что у меня есть:

Table 1 : USERS (autoID, name, etc)

Table 2 : TROPHIES (autoID, name, etc)

Table 3 : VIEWS (userID, timestamp, etc)

Table 4 : CANDIDATES (userID, trophyID, etc)

Что я знаю: USERS.autoID & TROPHIES.autoID

Как яСделайте это:

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

Каждый пользователь может быть номинирован на 1,2 или более трофеев из таблицы TROPHIES.

В таблице VIEWS я сохраняю каждое представление профилей для каждого отдельного пользователя с USERS.autoID, отметкой времени и другими данными.

В таблице CANDIDATES я храню TROPHIES.autoID и USERS.autoID - таким образом я знаю, какой пользователь назначен для какого трофея.

Что мне нужно знать

Знание USERS.autoID & TROPHIES.autoID Я хочу сделатьTOP на основе количества записей за последние 3 дня, например, в таблице VIEWS всех пользователей, перечисленных в таблице CANDIDATES для этого конкретного трофея, и узнайте ПОЗИЦИЮ на этой вершине конкретного пользователя.

Итакскажем, пользователь с autoID 1 назначен на трофей с тУ него autoID 10 и 100 записей в таблице VIEWS за последние 3 дня, но есть еще 3 пользователя, назначенные на TROPHY с autoID 10, которые имеют более 100 записей за последние 3 дня, так что ... Мне нужно выбратьвернул бы число 4.

Мои вопросы:

Могу ли я сделать это с помощью одного запроса SELECT?Если да ... как?Если нет ... как я мог сделать этот запрос, чтобы потратить как можно меньше ресурсов.

Спасибо!

[РЕДАКТИРОВАТЬ]

Вотнекоторые данные

ТАБЛИЦА 1 - ПОЛЬЗОВАТЕЛИ

+--------+-------+
| autoID | name  |
+--------+-------+
| 1      | user1 |
| 2      | user2 |
| 3      | user3 |
+--------+-------+

ТАБЛИЦА 2 - ТРОФИИ

+--------+------------+
| autoID | name       |
+--------+------------+
| 1      | Baseball   |
| 2      | Basketball |
| 3      | Boxing     |
+--------+------------+

ТАБЛИЦА 3 - ПРОСМОТРЫ

+--------+--------+------------+
| autoID | userID | timestamp  |
+--------+--------+------------+
| 1      | 2      | 1551632970 |
| 2      | 2      | 1551632971 |
| 3      | 3      | 1551632972 |
| 4      | 1      | 1551632973 |
| 5      | 2      | 1551632974 |
| 6      | 1      | 1551632975 |
| 7      | 3      | 1551632976 |
| 8      | 1      | 1551632977 |
| 9      | 2      | 1551632978 |
| 10     | 3      | 1551632979 |
| 11     | 3      | 1551632980 |
| 12     | 3      | 1551632981 |
+--------+--------+------------+

ТАБЛИЦА 4 -КАНДИДАТЫ

+--------+--------+----------+
| autoID | userID | trophyID |
+--------+--------+----------+
| 1      | 2      | 1        |
| 2      | 3      | 3        |
| 3      | 1      | 2        |
| 4      | 1      | 1        |
+--------+--------+----------+

В конце я хочу узнать, на какой позиции находится пользователь для конкретного трофея, основываясь на записях из таблицы VIEWS.

Допустим, я хочупроверьте положение ПОЛЬЗОВАТЕЛЯ с autoID = 1 для бейсбола (трофей с autoID = 1) после отметки времени 1551632972.

Итак ... Сначала мы должны увидеть, какие пользователи перечислены в этом трофее, чтобы мы моглиигнорировать записи из таблицы VIEWS для других пользователей.Трофей с autoID 1 (бейсбол) включает в себя только двух пользователей - user1 и user2.

Теперь я хочу посмотреть, сколько записей у обоих, так что я смогу узнать, какова позиция пользователя1 наthis top.

Так что, если мы выберем и посчитаем все записи из таблицы VIEWS для user1, где отметка времени равна или превышает 1551632972, мы получим число 3, и если мы сделаем то же самое для user2, то получим2 и так как 3 больше 2, user1 будет на 1-м месте, а user2 будет на 2-м месте.

Я ищу способ получить место в ТОПе для конкретного пользователя внутри определенногоиспользовать один запрос MySQL (если это возможно) или найти лучшее решение для этого ...

1 Ответ

0 голосов
/ 14 марта 2019

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

SELECT 
U.autoId, 
U.name,
U1.position

FROM USERS U
JOIN (SELECT 
@rownum := @rownum + 1 AS position,
U.autoId, 
U.name,

COUNT(V.autoID) as "Nr"

FROM USERS U
JOIN VIEWS V ON V.userID= U.autoID
JOIN CANDIDATESC ON C.userID= U.autoID

JOIN (SELECT @rownum := 0) R

WHERE C.trophyID= 'id_of_trophy_wanted' GROUP BY U.autoID ORDER BY Nr DESC) as U1 ON U1.autoID = 
U.autoID

WHERE U.autoID = 'id_of_user_wanted'

Спасибо тем, кто пытался помочь!

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