无法加入查询

Posted

技术标签:

【中文标题】无法加入查询【英文标题】:Unable to join queries 【发布时间】:2020-06-28 16:27:18 【问题描述】:

希望你能帮上忙,这给我带来了很多不必要的工作......

我有很多用户在每次开始游戏时都被分配了一个唯一的 session_id。这意味着如果他们崩溃和/或只是重新启动应用程序,他们可以在一天内获得多个 session_id 。我希望能够将所有这些 id 组合在一个查询中,而不必手动检查每个。

首先,我使用下面的查询来获取在特定时间范围内玩过游戏的用户列表。这给了我他们的 user_id,session_id 作为 PlayerName

SELECT
      user_id
    , session_id
    , value as PlayerName
FROM 
    bi_userevent
WHERE 
        context = 'Player'
    AND action = 'Name'
    [[AND local_time >= StartTime::timestamp at time zone 'US/Pacific']]
    [[AND local_time < EndTime::timestamp at time zone 'US/Pacific']]
GROUP BY 1,2,3
ORDER BY PlayerName

    SAMPLE DATA (From query above)
user_id          session_id           playername
4234hjh2342      asjd7a7yf978as       Player 1
4234hjh2342      asjd7a7yf978as       Player 1
f872j23hasd      52354294khjhjh       Player 2
9as90d09asd      zf87fsd08s7das       Player 3
9as90d09asd      80asd7g90asd7g       Player 3
9as90d09asd      aga90786e9a0f6       Player 3

现在,最困难的部分...我必须手动输入每个 session_id 以获取他们的游戏时间与服务器时间。由于每个玩家可以有多个 session_id,我允许为每个玩家输入多个 session_id(作为元数据库中的变量)。

SELECT          
    (EXTRACT(EPOCH FROM ( MAX(local_time) - MIN(local_time)) ::INTERVAL)/60)::integer as duration             
FROM bi_userevent     
WHERE 
    session_id = session_id
    [[OR session_id = session_id2]]
    [[OR session_id = session_id3]]
    [[OR session_id = session_id4]]

输入 session_id 后,我会运行查询,它会为我提供组合 session_id 的播放时间。我可以在一个查询中拥有多达 400 名玩家,输入数百个会话 ID 感觉就像是在浪费大量时间,感觉就像在浪费大量时间。 我以为我可以将第二个查询中的持续时间语句添加到第一个查询中并按 user_id 分组...简单吧?不,我得到的值为 0,我不知道为什么。

我的最终目标是运行 1 次查询,返回玩家姓名和 session_id 游戏时长...或者,更好的是加入所有单个玩家会话 id 以及 id 的组合游戏长度

感谢您的帮助,非常感谢!

【问题讨论】:

样本数据和期望的结果会有所帮助。 嗨,戈登,很抱歉。我将它添加到问题中。如果有帮助或需要更多信息,请告诉我。 您可能没有足够的声誉来投票,但作为问题的发布者,您有权接受答案。如果不确定如何使用tour。由于@Gordon 回答了您满意的问题,您应该接受它。这样做还有助于未来有类似问题的提问者看到可接受的答案。 【参考方案1】:

根据您的描述,您可以只运行一个查询。但是,我不清楚你是否想要一行:

SELECT (EXTRACT(EPOCH FROM ( MAX(local_time) - MIN(local_time)) ::INTERVAL)/60)::integer as duration             
FROM  sr_userevent
WHERE context = 'Player' AND
      action = 'Name'
      [[AND local_time >= StartTime::timestamp at time zone 'US/Pacific']]
      [[AND local_time < EndTime::timestamp at time zone 'US/Pacific']];

或者每个玩家一行:

SELECT value as playername, 
       (EXTRACT(EPOCH FROM ( MAX(local_time) - MIN(local_time)) ::INTERVAL)/60)::integer as duration             
FROM  sr_userevent
WHERE context = 'Player' AND
      action = 'Name'
      [[AND local_time >= StartTime::timestamp at time zone 'US/Pacific']]
      [[AND local_time < EndTime::timestamp at time zone 'US/Pacific']]
GROUP BY value;

编辑:

根据您的评论,JOIN 应该可以工作:

SELECT s2.playername, 
       (EXTRACT(EPOCH FROM ( MAX(s.local_time) - MIN(s.local_time)) ::INTERVAL)/60)::integer as duration             
FROM sr_userevent s JOIN
     (SELECT DISTINCT s2.value as playerName, s2.session_id
      FROM sr_user_event s2
      WHERE context = 'Player' AND
            action = 'Name'
            [[AND local_time >= StartTime::timestamp at time zone 'US/Pacific']]
            [[AND local_time < EndTime::timestamp at time zone 'US/Pacific']]
    ) s2
    ON s2.session_id = s.session_id
GROUP BY s2.playername;

【讨论】:

嘿 Gordon,不知道我之前在做什么,但我再次运行了这个查询,它运行良好......谢谢! (我没有足够的声誉来投票,否则我会)。

以上是关于无法加入查询的主要内容,如果未能解决你的问题,请参考以下文章

当 Doctrine 查询已加入时,setMaxResults 无法正常工作

在SQL内容含中文无法查询到数据怎么办?

nhibernate 强制分离查询而不是加入

无法将METABASE QUESTIONS转换为mongodb的sql查询

需要获取用户的所有地址。已有查询,但无法正确留下连接地址

nextcloud无法查询系统状况