生の mysql クエリを Laravel 4 のクエリ ビルダー、またはできれば Eloquent に移動したいと考えています。
セットアップ
- ゲームの割引キーを格納するデータベース。
- 割引キーは、各キー セットが 1 つのゲームに関連付けられているキー セットに格納されます (ゲームには複数のキーセットを含めることができます)。
- 次のクエリは、管理ページで表示するために、キー セットと関連データのテーブルを返すことを目的としています。
- 「これまでに使用されたキー」は、スケジュールされたイベントによって計算され、テーブルのログ エントリに定期的に保存/更新されます
keySetLogs
。(カウントが変化したときにのみデータをログに記録するのは十分にスマートです) - 「使用されたキー」の最新の値を表示したいと考えています。これは、「グループあたり最大 n」の問題です。
生のクエリ
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
コードは、この質問で説明されているように使用されます。
出力例:
+-----------+-------------+----------+------------+-----------+
| 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 |
...
質問)
とKeySet
、関係関数を設定して作成された Eloquent モデルがKeySetLog
あります。Game
- クエリビルダーでネストされたクエリを作成するにはどうすればよいですか?
- クエリ全体を雄弁に書くことは可能ですか (手動で結合を書く必要はありません)?