Larabelでサーバを構築しています。
TableAとTableBがあり、★評価の数値をTablesBで管理していてTableAにはUser情報が入っています。
TableAにUser1が存在していた場合にTableBには評価が存在しない場合もあり、複数存在する場合もあります。
複数存在する場合は平均値を求めてGetしたいです。
TablesBにはdataで1から5の数値で入っているので、1と5なら平均の3をユーザ毎に出力したい場合のクエリの書き方をご教授ください。
Controllerでデータベースのクエリを以下のように記載していますが、エラーとなります。
どのように記載すべきかご意見をお願いします。
DB::connection()->enableQueryLog();
$s_word = $request->input('s_word');
$result = DB::table('table_a')
->leftjoin('table_b', function ($join) {
$join->on('table_a.userid', '=', 'table_b.userid')
->avg('data');
});
$result = $result ->get();
"message": "SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to you
r MySQL server version for the right syntax to use near 'on `table_a`.`userid` = ?' at line 1 (SQL: select avg(`data`) as aggregate on `table_a`.`
userid` = table_b.userid)",
●table_a:ユーザテーブル
userID | Name |
---|---|
1 | userA |
2 | userB |
●table_b:評価テーブル
userID | Data |
---|---|
1 | 1 |
1 | 5 |
●期待するクエリ回答
1,userA,3
2,userB,null
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
質問への追記の内容から、SQL文が既にできていてSQLをクエリビルダーに落とし込むのが大変な場合は、SQLを直接書く方法で対応してみてください。
Laravel 5.5 データベース:利用開始 SQLクエリの実行
DB:selectを使えば、PDOのような感覚でSQLがそのまま書けます。
(例)
$users = DB::select('select * from users where active = ?', [1]);
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
aro10
2017/09/30 01:03
問題解決に重要なので、クエリエラーの詳細を追記してください。
yamayamak
2017/09/30 11:18
ありがとうございます。エラーを追記しました。よろしくお願いします。
t_obara
2017/09/30 16:44
そもそも、クエリビルダで構築する前に、取得できるsqlを考えて、それを置き換えるようにした方が考えやすいかと思います。期待するデータを得るためのsqlコマンドは理解されているのでしょうか?Noであるならば、そちらの方をお聞きになった方が、larabelを知らなくてもsqlについてはご存知の方からも回答が得られるやすくなるかと思います。Yesの場合は、sql文をクエリビルダで表現するにはどうしたらといった質問の方がわかりやすいので、これも回答が得られるやすくなるかと思います。
yamayamak
2017/09/30 17:03 編集
SQLでは以下のような感じで出来ています。
「 select `userID`,`Name`, AVG(data) as r_avg from `table_a` left join `table_b` on `table_a`.`userid` = `table_a`.`userid` group by `userid`;」
実際に実装するのはLaravelで実装しないと難しいので、Laravelでの実施の仕方を教えて欲しいです。 できそうで出来ないところなのですが、出来ないのでしょうか?
t_obara
2017/09/30 17:34
そこまで既にご理解いただけているのであれば、 https://readouble.com/laravel/5.3/ja/queries.html この辺りが参考になるでしょう。既に回答も一部出ておりますが、回答は一つだけではないので、ご自身の好み・わかりやすさで選択されてはいかがでしょうか。できそうでできないという部分はもしかするとrawを利用するとよいと思います(前述のリンクに記載がありますが)。