我有一个MySQL查询:
的游戏数量。
在我看来,这个代码可能要小得多。我将如何使这个查询更小。http://sqlfiddle.com/#!2/6d211/1
任何帮助都是非常感谢的,即使你只是给我的链接来结帐。
发布于 2012-03-24 04:53:07
通常,将连接逻辑作为[Inner|Left] Join子句的一部分而不是Where子句的一部分是一个好主意。在简化查询的情况下,这将清除Where子句,以便查询处理器不会过早地应用筛选条件,这将限制您想要在查询的更复杂部分执行什么(并影响查询的总体性能)。
通过重构连接条件,我们可以通过三个表将查询简化为其核心连接,然后将连接添加到发生聚合的专用子查询中。这只会导致一个嵌套查询,该查询连接到最少需要的表中。
我想出的是:
SELECT
u.user_id
,pg.game_id
,u.user
,g.game
,g.game_cat
,ga.cat_count
,ga.fps_count
FROM users u
inner join played_games pg
on u.user_id = pg.user_id
inner join games g
on pg.game_id = g.id
inner join
(
select
ipg.user_id
,ig.game_cat
,count(ig.game) cat_count
,sum(case when ig.game_cat = 'fps' then 1 else 0 end) fps_count
from played_games ipg
inner join games ig
on ipg.game_id = ig.id
group by
ipg.user_id
,ig.game_cat
) ga
on g.game_cat = ga.game_cat
and pg.user_id = ga.user_id
order by
ga.fps_count desc
,u.user
,ga.cat_count desc;原始查询(除了轻微重命名外)的一个不同之处是,对于没有玩过FPS游戏的玩家,fps_count字段的值为0而不是NULL。希望这不是那么关键,而是有助于为查询添加意义。
最后,我不确定如何使用它的上下文。在我看来,它可能在列出每个用户所玩的每一个游戏(一个目标)和总结每个用户所玩的游戏类别(一个单独的目标)方面都做了太多的工作。这意味着摘要细节正在重复多次,例如,对于某个特定类别的多个游戏的用户来说,这可能并不理想。我的建议是将这些内容分成两个不同的查询,尽管我不知道这是否能满足您的特定需求。
希望这能有所帮助。
发布于 2012-03-24 05:25:16
我在考虑是提供d_mcg解决方案还是这个解决方案。我决定选这个。我在想哪个会更快。你可以试着告诉我们:)
select u.user_id, pg.game_id, u.user, g.game, g.game_cat,
(select count(*) from played_games pg2
join games g2 on pg2.game_id = g2.id
where pg2.user_id = pg.user_id and g2.game_cat = g.game_cat) cat_count,
(select count(*) from played_games pg3
join games g3 on pg3.game_id = g3.id
where pg3.user_id = pg.user_id and g3.game_cat = g.game_cat and
g.game_cat = 'fps') order_count
from users u
left join played_games pg on u.user_id = pg.user_id
join games g on pg.game_id = g.id
order by order_count desc, u.user, cat_count deschttps://stackoverflow.com/questions/9848815
复制相似问题