🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

1回答

1209閲覧

クエリでの集計で、子テーブルの演算結果が親テーブルの出力数に影響される

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2019/10/15 03:24

前提・実現したいこと

クラブの定期サービスを利用している人の、滞納金データが正しく記録されているか検証しようとしています
成功失敗を含む、全決済記録を残しているPayLogテーブルの正しく決済できた合計金額
滞納金を記録したDelinquencyテーブルの合計金額
これを足した合計が、(ユーザーが加入しているプランの金額 ✖️ 加入期間) の合計とイコールになるか計算しようとしています

レコード数が多いので、cakephpで計算するのではなくクエリで計算しようと思っています

現在「PayLogテーブルの正しく決済できた合計金額」と「Delinquencyテーブルの合計金額」の計算で詰まっています

発生している問題・エラーメッセージ

「PayLogテーブルの正しく決済できた合計金額」、これは正しく計算できていました
「Delinquencyテーブルの合計金額」はこのユーザーの場合1000円です。親テーブルが出力された分だけこちらも出力されてしまっています

["customer"]=> string(32) "cus_aaabbbccc" ["plAmoun"]=> string(5) "18000" ["dAmount"]=> string(5) "18000" ["Delinquency"]=> array(1) { ["pay_customer_id"]=> string(32) "cus_aaabbbccc" }

該当のソースコード

$query = $this->PayLog->find(); $query->join([ 'table' => 'recurring_billing', 'alias' => 'RecurringBilling', 'type' => 'INNER', 'conditions' => 'PayLog.recurring_billing = RecurringBilling.Pay_recurring_billing_id' ]); $query->join([ 'table' => 'delinquency', 'alias' => 'Delinquency', 'type' => 'INNER', 'conditions' => 'PayLog.customer = Delinquency.Pay_customer_id' ]); $query->where([ 'PayLog.error_code is null', 'PayLog.recurring_billing is not null', 'RecurringBilling.recurring_billing_status_id !=' => 3 ]); $query->select([ 'PayLog.customer', 'plAmoun' => 'sum(PayLog.amount)', 'Delinquency.Pay_customer_id', 'dAmount' => 'sum(Delinquency.amount)' ]); $query->group([ 'PayLog.customer', 'Delinquency.Pay_customer_id' ]); $result = $query->limit(100); foreach($result as $v){ var_dump($v); exit; }

where句の条件について
'PayLog.error_code is null',
決済が失敗していないこと

'PayLog.recurring_billing is not null',
定額サービスに加入済みであること

'RecurringBilling.recurring_billing_status_id !=' => 3
定額サービスを解約していないこと

・・・・

ログイン中のユーザーなどのように特定のIDがわかっているわけではないもので、複数のテーブルを集計しなければならない場合どのような手法を使うことが一般的でしょうか?

補足情報(FW/ツールのバージョンなど)

cakephp3
Mysql

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

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

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

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

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

yambejp

2019/10/15 03:28

まずはテーブルの構成を確認し、素のSQL文で組み立ててみることです その上でcake形式に組み立て直してアクセスしてみてください
guest

回答1

0

複数のテーブルを集計しなければならない場合どのような手法を使うことが一般的でしょうか?

結合が1:1になるように、集計を行っていくと間違いが少なくなります。

例えば、AとBの関係が、1:nの場合、Bをgroup byして集計を行った結果を結合するように、ネストさせます。

投稿2019/10/15 08:11

sazi

総合スコア25327

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問