无法加入查询
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 无法正常工作