前提・実現したいこと
PHP(laravel)でデータを検索するシステムを作っています。
クエリビルダでpaginateを使用して1ページに10件づつ検索のデータを表示しているのですが、
スコア(scoreというカラム)を降順に並び替えたデータで同じ名前(nameというカラム)のものが連続して複数件並んでいる場合に3件のみ表示するようにしたいのですが、実装の方法がわかりません。
例えば、福岡という検索ワードに対して、1ページ目に4件以上の同じ名前があった場合。四つ目はページは非表示となり、本来2ページ目の最初に来る予定だった結果が、繰り上がって1ページ目に表示されるといったことを実現したいです。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
以下検索時に発行されているSQLです //同じnameが4件以上ある場合に繰り上げたい select `id`, `title`, `name`, `score`, from `table` where `del_flg` = 0 and `view_flg` = 0 // キーワード検索 and (`keyword` like '%%' or `title` like '%%') tp_sumの降順、vscoreの降順、 order by `score` desc // limit 10 offset 0はpaginateメソッド limit 10 offset 0
試したこと
paginateでなくgetメソッドで全件取得したあと、データを整形するといったことを試した見たのですが、検索ワードが広い状態だとgetで取得したことによりメモリのエラーが発生してしまいました。そのため、現在sql文を修正して実現できるように調べています。
https://qiita.com/ryota_i/items/8d0cc238c269fe9ca016
こちらの方法でwindow関数を使用してデータを取得することも検討しましたが、素のsqlを書く必要があり、pagenateメソッドが使用できないため、断念しました。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
laravel8、php7.3 a
あなたの回答
tips
プレビュー