MYSQLについて質問です。


例えば

飲み物、お菓子、電化製品、事務用品 等の複数のグループがあってグループIDでひも付けして各商品レコードがあります。

それらの商品を一覧ページに表示させた時に同じグループの商品が一ページに密集して集まるのを防ぐ為に1ページには同じグループの商品は基本2つまで表示させたいです。
※ページャー機能付き

一覧ページの商品は10個まで表示としてグループによって商品の数に違いがあるので2ページ目、3ページ目と進んで行くうちに残ったグループが2つずつの表示では10個表示されない場合は10個を満たすまで2つずつ残ったグループの商品を表示させたいです。

この処理をMYSQLだけでやる事は可能でしょうか。

php側で処理を行なってJSONでキャッシュも考えたのですが検索条件(where)が何万通りあるのでキャッシュは難しそうです。

よろしくお願いします。







回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/11/19 13:47:55
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

ポイント70pt

SQL文だけでは実現できません。

理由は、グループの組み合わせの数だけwhere句を用意するか、サブクエリを用意する必要があるためで、現実的ではないためです。

PHP側なら実現できるでしょうが、お気づきのように何らかの形で全部の組み合わせをキャッシュする必要がありそうです。
具体的には、次の2つの値を持つ配列を用意します。
  商品ID, グループID
この配列を10個単位で区切って、グループIDがなるべく重ならないようにするのです。

id:yu3ho7

やはり、方法はないですよね。。一番、いい方法もう少し探ってみます。
ありがとう御座います。

2012/11/14 19:30:58
id:watercooler No.2

回答回数289ベストアンサー獲得回数51

ポイント130pt

ストアードプロシージャ使ったらできそうな感じね。
パフォーマンスは変わらないみたい。
http://blog.asial.co.jp/1012

phpでグループID1つ1つMySQLにコールしたほうが早そうに思うわね。
プリペア使えばかなり早くなるはずよ。

あまり具体的な回答でなくてごめんなさいね。

id:yu3ho7

ストアードプロシージャ知らなかったので確認してみます!
ありがとう御座います!

2012/11/14 19:30:20
  • id:Mook
    最後の数ページである一つのグループだけしか残らなかった場合はどうするのでしょうか?
  • id:yu3ho7
    その場合は同じグループの商品が連続して表示してもOKのようにしたいです。
  • id:Mook
    目的によって実装が変わる気がするのですが、
    ページングをするということは多数の中から一定数を抽出して、順番に表示すること
    だと思いますが、全体の順序は固定でよいのでしょうか。

    それとも、一定時間や、参照のたびにページの内容を変更したいのでしょうか。
    またリスト全体のデータ量はどのくらいを想定していますか?

    全体数が数少なければ、初回にリストを作成してcookie管理をしたり、
    固定順でよければ、表示のためのカラムを用意し乱数などで定期的に順番を作成する
    運用も考えられそうです。

    けれど、商品広告などであれば最初に持ってきたい商品群もある気がしますし、
    もう少しやりたい内容とデータ数などの情報を提示されてはと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません