・ユーザはレビューを投稿することができ、そのレビューに対して各ユーザは1件の「いいね」をつけることができる。という仕様です。
ユーザごとにレビュー一覧ページを作り、それを「いいね」が多い順でソートがしたいのですがつまずきました。
help_fullsTがいいねを管理するテーブルで、ユーザIDとレビューIDを持つ中間テーブルとなってます。
考えたのが、「いいね」が多い順でソートするためにまずreviewsTへ直接orderbyをかけるのではなく、
ソート済みのreviews.idの配列を取得するロジックを記述しました。そのSQLは下記のとおりです。
■そのユーザのレビューをいいねが多い順でソート
SQL
1select 2 reviews.id, 3 count(*) as cnt 4from 5 reviews 6 left join help_fulls ON reviews.id = help_fulls.review_id 7where 8 users.id = { $userId } 9group by 10 reviews.id 11order by 12 cnt desc
しかしこれだとレビューに対するいいねが0件or1件のときのソートが適切でなくなってしまいます。
0件のときはhelp_fullsのレコードは存在しませんがleftjoinでレコードがつくられてしまい
groupbyで集計したさいに1件としてカウントされてしまうためです。
これを改善するにはどうしたら良いのでしょうか?DB設計に変更は加えたくはないです。
よろしくおねがいします。
回答1件
あなたの回答
tips
プレビュー