【问题标题】:MySQL Select to create a rank based on number of entries from a table...how to do it?MySQL 选择根据表中的条目数创建排名...怎么做?
【发布时间】:2019-08-03 16:23:04
【问题描述】:

我有什么:

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 表,其中存储了可以提名用户的不同类别。

每个用户都可以从 TROPHIES 表中提名 1,2 个或更多奖杯。

在 VIEWS 表中,我使用 USERS.autoID、时间戳和其他数据存储每个用户的个人资料的每个视图。

在 CANDIDATES 表中,我存储了 TROPHIES.autoID 和 USERS.autoID - 这样我就知道哪个用户被提名为哪个奖杯。

我需要知道的

了解 USERS.autoID 和 TROPHIES.autoID 我想根据过去 3 天的条目数创建一个 TOP,例如在 CANDIDATES 表中针对该特定奖杯列出的所有用户的 VIEWS 表中,并找出POSITION 在特定用户的顶部。

因此,假设具有 autoID 1 的用户被提名为具有 autoID 10 的 TROPHY,并且在过去 3 天的 VIEWS 表中有 100 个条目,但是还有其他 3 个具有 autoID 10 的用户被提名到 TROPHY,他们有过去 3 天内有超过 100 个条目,所以...我需要一个可以返回数字 4 的选择。

我的问题:

我可以用 1 个 SELECT 查询来做到这一点吗?如果是……怎么办?如果没有...我怎样才能使这个查询花费尽可能少的资源。

谢谢!

[编辑]

这是一些数据

表 1 - 用户

+--------+--------+ |自动识别 |姓名 | +--------+--------+ | 1 |用户1 | | 2 |用户2 | | 3 |用户3 | +--------+--------+

表 2 - 奖杯

+--------+------------+ |自动识别 |姓名 | +--------+------------+ | 1 |棒球 | | 2 |篮球 | | 3 |拳击 | +--------+------------+

表 3 - 视图

+--------+--------+------------+ |自动识别 |用户名 |时间戳 | +--------+--------+------------+ | 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 - 候选人

+--------+--------+----------+ |自动识别 |用户名 |奖杯ID | +--------+--------+----------+ | 1 | 2 | 1 | | 2 | 3 | 3 | | 3 | 1 | 2 | | 4 | 1 | 1 | +--------+--------+----------+

最后,我希望能够根据 VIEWS 表中的条目了解用户在特定奖杯上的位置。

假设我想在时间戳 1551632972 之后检查棒球的 autoID = 1 的 USER 的位置(autoID = 1 的奖杯)。

所以...首先,我们必须查看此奖杯中列出了哪些用户,这样我们就可以忽略其他用户的 VIEWS 表中的条目。 autoID 为 1(棒球)的奖杯仅列出了两个用户 - user1 和 user2。

现在我想看看两者都有多少条目,以便能够找出 user1 在此顶部的位置。

因此,如果我们从表 VIEWS 中为 user1 选择并计算时间戳等于或大于 1551632972 的所有条目,我们将得到数字 3,如果我们为 user2 做同样的事情,我们将得到 2,因为 3 更大超过 2,user1 将排在第 1 位,user2 将排在第 2 位。

我正在寻找一种方法,以便使用单个 MySQL 查询(如果可能)为特定运动中的特定用户获得 TOP 中的位置,或者寻找最佳解决方案...

【问题讨论】:

  • 显示一些示例数据和预期输出。你试过什么 SQL?
  • 您的USERS 表没有userID 列。如果autoID 字段自动增加,则它不是表之间的唯一关系。也许name

标签: php mysql mysqli


【解决方案1】:

我找到了解决方案...我将把它留在这里以防其他人需要它。

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'

感谢那些试图提供帮助的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多