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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

7651閲覧

laravelクエリビルダのgroupby、orderbyについて

kotakeshi0923

総合スコア28

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2017/09/12 07:09

Laravel5.4で、以下のコードで出力した結果をviewで一覧しようとしていますが、
グルーピングすると、orderbyでdescでソートした最初のレコードが表示されません。

どのようにすれば、descソートの最初の行が表示されるでしょうか?

$contents = DB::table('contents')->select()->join('contents_detail','contents_detail.ctnts_code',"=","contents.ctnts_code") ->orderby('contents.ctnts_code','asc')->orderby('cnts_detl_code','desc')->groupby('contents_detail.ctnts_code')->Paginate(15);

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

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

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

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

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

masaya_ohashi

2017/09/12 07:30

groupbyの記述だけ削除した場合(つまりorderbyだけかけた場合)、正しい件数が表示されますか?
masaya_ohashi

2017/09/12 07:31

また、逆にorderbyだけ削除した場合も、想定通りの結果になりますか?
kotakeshi0923

2017/09/12 08:53

想定通りの出力になります。
masaya_ohashi

2017/09/12 23:52

$contentsをどのように表示していますか?$contentsをjson_encodeした場合でも、最初のレコードが含まれていない状態ですか?
kotakeshi0923

2017/09/13 01:46

MYSQLで直接SQLを実行しても同様の型式で出力されるので、json型式などは関係ないようです。$contentsは、blade型式で <td>{{$val->ctnts_code}}</td>  の項目で出力しています。
masaya_ohashi

2017/09/13 01:56

想定する結果と、実際の結果を比較で記載していただけますか?
kotakeshi0923

2017/09/13 03:57

色々とありがとうございます。aro10さんのご指摘通り、まずは想定出力可能なSQLを調査してみます。想定結果は、contentsIDが昇順に、それに紐づくcontents_detailIDが降順に並んだデータを、contentsIDでグルーピングした結果、各contentsIDに紐づくcontents_detailIDが一番大きいものを表示させるという形になります。
guest

回答1

0

ベストアンサー

Laravelのデータベースクエリは最終的にはSQLに変換されるので、以下のように実際に発行されたSQLを確認してみるとクエリに問題がある場合に判断材料になるかと思います。
クエリに問題なければ、$contentsを利用しているコレクション処理等に問題があるかと思います。

\DB::enableQueryLog(); $contents = DB::table('contents')->select()->join('contents_detail','contents_detail.ctnts_code',"=","contents.ctnts_code") ->orderby('contents.ctnts_code','asc')->orderby('cnts_detl_code','desc')->groupby('contents_detail.ctnts_code')->Paginate(15); dd(\DB::getQueryLog());

投稿2017/09/12 14:33

aro10

総合スコア4106

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

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

kotakeshi0923

2017/09/13 01:40

以下を直接MYSQLで実施してみましたが、Laravelと同様の型式で出力されました。 一工夫必要なのかもしれません。 select * from contents as t1 INNER JOIN contents_detail as t2 on t1.ctnts_code = t2.ctnts_code GROUP BY t1.ctnts_code ORDER BY t1.ctnts_code ASC,t2.cnts_detl_code DESC
aro10

2017/09/13 01:53

意図した結果が出力されるSQLが出来た後に、Laravelのクエリビルダーに直すのが面倒な場合は以下のようにLaravelで直接SQLを書く方法もあります。 ``` $users = DB::select('select * from users where active = ?', [1]); ``` [SQLクエリの実行](https://readouble.com/laravel/5.4/ja/database.html#running-queries)
kotakeshi0923

2017/09/13 03:53

ご指摘通りですね。 まずはSQLで出力されるSQLを確認して、Laravel用に変換するのが難しければ、 アドバイス頂いた内容でSQLを直接Laravelから実行してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問