首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将原始最大n个组MySQL查询切换到

将原始最大n个组MySQL查询切换到
EN

Stack Overflow用户
提问于 2013-09-02 11:42:53
回答 1查看 410关注 0票数 0

我想将原始的mysql查询移到Laravel 4的查询生成器中,或者最好是雄辩的。

设置

  • 一种用于存储游戏折扣键的数据库。
  • 折扣键存储在键集中,其中每个键集与一个游戏相关联(一个游戏可以有多个键集)。
  • 下面的查询旨在返回一个键集和相关数据表,以便在管理页上查看。
  • “到目前为止使用的键”由调度事件计算,并定期存储/更新在表keySetLogs中的日志条目中。(当计数发生变化时,只记录数据是非常明智的)
  • 我们想要显示“使用的密钥”的最新值,这是一个“每个组最大的n”问题。

原始查询

代码语言:javascript
复制
SELECT
    `logs`.`id_keySet`,
    `games`.`name`,
    `kset`.`discount`,
    `kset`.`keys_total`,
    `logs`.`keys_used`
FROM `keySets` AS `kset`
INNER JOIN
(
    SELECT
        `ksl1`.*
    FROM `keySetLogs` AS `ksl1`
    LEFT OUTER JOIN `keySetLogs` AS `ksl2`
        ON (`ksl1`.`id_keySet` = `ksl2`.`id_keySet` AND `ksl1`.`set_at` < `ksl2`.`set_at`)
    WHERE `ksl2`.`id_keySet` IS NULL
    ORDER BY `id_keySet`
)
AS `logs`
    ON `logs`.`id_keySet` = `kset`.`id`
INNER JOIN `games`
    ON `games`.`id` = `kset`.`id_game`
ORDER BY `kset`.`id_game` ASC, `kset`.`discount` DESC

注意:嵌套查询从日志中获取最新的keys_used值。此greatest-n-per-group代码用于讨论in this question

示例输出:

代码语言:javascript
复制
+-----------+-------------+----------+------------+-----------+
| id_keySet | name        | discount | keys_total | keys_used |
+-----------+-------------+----------+------------+-----------+
|         5 | Test_Game_1 |   100.00 |         10 |         4 |
|         6 | Test_Game_1 |    50.00 |        100 |        20 |
|         3 | Test_Game_2 |   100.00 |         10 |         8 |
|         4 | Test_Game_2 |    50.00 |        100 |        14 |
|         1 | Test_Game_3 |   100.00 |         10 |         1 |
|         2 | Test_Game_3 |    50.00 |        100 |         5 |
...

问题

我已经创建了KeySetKeySetLogGame等功能强大的模型,并设置了关系函数。

  1. 如何在查询生成器中编写嵌套查询?
  2. 是否可以完全使用雄辩(不手动编写联接)编写查询?
EN

回答 1

Stack Overflow用户

发布于 2013-09-02 12:38:37

我不知道Laravel或雄辩,所以我可能不应该发表评论,但是如果性能没有问题,那么在我看来,这个查询可以重写如下:

代码语言:javascript
复制
 SELECT ksl1.id_keySet
      , g.name
      , k.discount
      , k.keys_total
      , ksl1.keys_used
   FROM keySetLogs ksl1
   LEFT 
   JOIN keySetLogs ksl2
     ON ksl1.id_keySet = ksl2.id_keySet
    AND ksl1.set_at < ksl2.set_at
   LEFT
   JOIN keysets k
     ON k.id = l.id_keySet
   LEFT
   JOIN games g
     ON g.id = k.id_game
  WHERE ksl2.id_keySet IS NULL
  ORDER 
     BY k.id_game ASC
      , k.discount DESC
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18572467

复制
相关文章

相似问题

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