Laravel6.3にて開発中のサイトのSQLの組み立てとクエリビルダを構築するのに詰まってしまい、手が止まってしまいました。
表題からはわかり辛いかもしれませんが、抽出したい条件は、質問に対する回答結果を格納しており、質問毎に回答数を集計して、質問に関連するタグ毎に集計した回答数を合計して、合計数の多いタグ毎に並べ替えたい、というものです。
簡易ですがテーブル状況は以下です。(不要なカラムは省略しています。)
・質問(文字)テーブル (words)
id int
・タグテーブル (tags)
id int
・タグ質問関連付けテーブル(tag_word)
id int
word_id int (words.id 参照制約)
tag_id int (tags.id 参照制約)
・回答結果テーブル (results)
id int
word_id int (words.id 参照制約)
result tinyint (0か1)
回答結果テーブルを文字ID毎に集計し、それをタグ質問関連付けテーブルと結合してタグID毎に集計数を合計させるために以下のようなビルダを書きましたが、どうも最初の集計結果$query->get()->sum('results_count')
と結合後の合計数$items->sum('results_sum')
が合わなくなって(数が減って)しまっており、正しい結果が得られません。
php
1 $query = \DB::table('results') 2 ->selectRaw('word_id, count(*) as results_count') 3 ->groupBy('word_id'); 4 5// dd($query->get()->sum('results_count')); 6 7 $items = \DB::table('tag_word') 8 ->selectRaw('tag_word.tag_id, sum(words_with_results_count.results_count) as results_sum') 9 ->joinSub($query, 'words_with_results_count', 'tag_word.word_id', '=', 'words_with_results_count.word_id') 10 ->groupBy('tag_word.tag_id') 11 ->orderBy('results_sum', 'desc') 12 ->get(); 13// ->toArray() 14// ->toSql(); 15 16 dd($items->sum('results_sum'));
SQLは以下のように生成されています。
結合方法を間違えているのか、グルーピング方法が違うのか、初歩的な事かもしれませんが、
お詳しい方がおられましたら、御教示頂けると幸いでございます。
どうぞ宜しくお願い致します。
sql
1select tag_word.tag_id, sum(words_with_results_count.results_count) as results_sum 2from `tag_word` inner join ( 3 select word_id, count(*) as results_count 4 from `results` 5 group by `word_id` 6) as `words_with_results_count` 7on `tag_word`.`word_id` = `words_with_results_count`.`word_id` 8group by `tag_word`.`tag_id` 9order by `results_sum` desc;
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/19 12:51