首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个MySQL查询可能的最小数量的代码?

这个MySQL查询可能的最小数量的代码?
EN

Stack Overflow用户
提问于 2012-03-24 03:06:13
回答 2查看 78关注 0票数 2

我有一个MySQL查询:

  • 从由唯一id链接的三个表中获取数据。
  • 计算在每个类别中玩的游戏数量,从每个用户
  • 中计算出每个用户所玩的属于"fps“类别

的游戏数量。

在我看来,这个代码可能要小得多。我将如何使这个查询更小。http://sqlfiddle.com/#!2/6d211/1

任何帮助都是非常感谢的,即使你只是给我的链接来结帐。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-24 04:53:07

通常,将连接逻辑作为[Inner|Left] Join子句的一部分而不是Where子句的一部分是一个好主意。在简化查询的情况下,这将清除Where子句,以便查询处理器不会过早地应用筛选条件,这将限制您想要在查询的更复杂部分执行什么(并影响查询的总体性能)。

通过重构连接条件,我们可以通过三个表将查询简化为其核心连接,然后将连接添加到发生聚合的专用子查询中。这只会导致一个嵌套查询,该查询连接到最少需要的表中。

我想出的是:

代码语言:javascript
复制
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。希望这不是那么关键,而是有助于为查询添加意义。

最后,我不确定如何使用它的上下文。在我看来,它可能在列出每个用户所玩的每一个游戏(一个目标)和总结每个用户所玩的游戏类别(一个单独的目标)方面都做了太多的工作。这意味着摘要细节正在重复多次,例如,对于某个特定类别的多个游戏的用户来说,这可能并不理想。我的建议是将这些内容分成两个不同的查询,尽管我不知道这是否能满足您的特定需求。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2012-03-24 05:25:16

我在考虑是提供d_mcg解决方案还是这个解决方案。我决定选这个。我在想哪个会更快。你可以试着告诉我们:)

代码语言:javascript
复制
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 desc
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9848815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档