質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

1回答

3363閲覧

ORMを利用してSUMの合計値を算出しuser_idごとに選別する。

amaguri

総合スコア227

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2017/03/31 08:47

編集2022/01/12 10:55

やりたいこと
現在日付2017-03-31

テーブル名 points 中身 id |user_id |point | expiration_date 1 | 1 |100 |2017-01-21 2 | 1 |400 |2018-12-31 3 | 2 |300 |2016-05-09 4 | 2 |200 |2017-10-21 5 | 3 |100 |2018-03-20 6 | 3 |1000 |2016-10-21
テーブル名 members 中身 id |user_id |point 1 | 1 |10000 2 | 2 |4000 3 | 3 |3000 4 | 4 |2000

ーーーーーーーーやりたいロジックーーーーーーー

①pointsテーブルから有効期限が今日までのポイントをユーザーごとに合計し算出。※これをORMで記載

---SQLではこうしていました--- select SUM(point) from points where user_id = ユーザーID and expiration_date >= now(); --group by-- select user_id,SUM(point) from points where expiration_date >= now() group by user_id; 結果 user_id|SUM(point) 1 | 100 2 | 200 3 | 100

②①で取得したポイントの合計データとmembersテーブルのポイントをuser_id同士で比べ、
①で取得したポイント<membersのポイントの場合
membersのポイント - ①で取得したポイントmembersのポイント = $引かれたポイント数を表示する。

ーーーーーーーーーーーーーーーーーーーーーーーーーー

foreachで毎回idで検索クエリを流しDBからデータを取得するやり方は好まれないので、
pointsテーブル、membersテーブルそれぞれ一回ずつgroup byか何かを使ってそれぞれのテーブルから一回ずつのデータの取得で実現するにはどうすれば良いでしょうか?

自分が考えていたのは毎回ループにて取得をしようとしていたのですがそれではダメだと言われたのでお力を貸していただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

集計はOrm\Model::queryではなく、素直にDB::queryを使ったほうが簡単だと思います。
ちょっと全体像をつかみきれていないのでpointsテーブルだけで、
ユーザー別に全ポイント、今日まで有効なポイントを取得する例を書いてみました。
MySQLの関数部分はDB::exprメソッドを通さないと、エスケープされて
正常に動かないかもしれません。

SQL

1SELECT 2 p1.user_id, 3 SUM(p1.point) AS total, 4 expiration 5FROM 6 points AS p1 7LEFT JOIN 8 (SELECT user_id, SUM(point) AS expiration 9 FROM points 10 WHERE expiration_date < DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY) 11 GROUP BY user_id) 12AS p2 13ON p1.user_id = p2.user_id 14GROUP BY user_id;

DB - クラス - FuelPHP ドキュメント
http://fuelphp.jp/docs/1.8/classes/database/db.html

Fuelphp:エスケープしないでSQLを実行する「DB::expr()」 | raining
http://raining.bear-life.com/fuelphp/%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%81%97%E3%81%AA%E3%81%84%E3%81%A7sql%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%80%8Cdbexpr%E3%80%8D

投稿2017/04/01 22:30

編集2017/04/01 22:36
nnssn

総合スコア1221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaguri

2017/04/03 00:55

なるほど!ありがとうございます、試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問