MySQLについて質問です。


MySQLのバージョンは、 3.23.58 です。

商品検索などで、商品価格で条件でソートを行い、1つのデータを抽出した場合に前後のデータを1つずつ一緒に抽出したいのですが何か良い方法はありませんか?

商品の価格がまったく同じものがあり、うまく行きません。

ソートした場合に、選択したレコードがソートした結果の何番目とか分かればよいのですが…

それに、現在は、選択したレコードの呼び出し、前、後ろと3回クエリを送信してデータを呼び出しています。

クエリの回数も減らしたいです。

回答の条件
  • 1人50回まで
  • 登録:2009/11/17 23:35:57
  • 終了:2009/11/24 23:40:02

回答(3件)

id:HALSPECIAL No.1

HALSPECIAL回答回数407ベストアンサー獲得回数862009/11/18 00:32:37

ポイント27pt

行番号を振るのは次のページが参考になります

MySQLで行番号を表示するには

http://d.hatena.ne.jp/railtown/20080523/1211510996

が、

そのバージョンでは、サブクエリ、UNION、ストアドも使えないと思うので、

SQL一発での取得は無理でしょう。

id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012009/11/18 00:35:26

ポイント27pt

他の質問 http://q.hatena.ne.jp/1258401815 の関連質問ですね。


先の質問では、

1回目のクエリでソートと抽出までを行っているものと想定していましたが、

今回の質問文によると、

  (1)商品価格条件でソートを行い一覧表示

  (2)その中から1レコードを指定

  (3)指定されたレコードおよび前後のレコードの詳細を抽出

といったような流れのものだということでしょうか・・・。


この場合の対処としては(1)を行っているプログラム側にて、

(案1)プログラム中にて一時的に記憶しておく

   キャッシュなどを用いますが、古い環境のようなので実装は面倒そうですし、

   サーバ負荷も上がりそうな気がします。

あるいは

(案2)一覧表の中に、前後のレコードを示す商品コード番号的なものを入れておく

   特に負荷が増える事はありませんし(3)のクエリは1回で済みます。

といったような措置を取る事になります。

id:b-wind No.3

b-wind回答回数3344ベストアンサー獲得回数4402009/11/18 02:45:52

ポイント26pt

商品の価格がまったく同じものがあり、うまく行きません。

これと

ソートした場合に、選択したレコードがソートした結果の何番目とか分かればよいのですが…

それに、現在は、選択したレコードの呼び出し、前、後ろと3回クエリを送信してデータを呼び出しています。

これは全く別問題。


1つめの方は同一価格の物の順番をどうするかは仕様で決めないとだめ。

RDBMS の基本としては ORDER BY に明示されない場合は順不同になるから。


2つめの方は該当バージョンの MySQL で直接的に行う方法は無いので、

どこかで小細工をしてやる必要がある。

商品数や検索の頻度、条件がどのくらいあるかが不明なので何が良いかははっきり言えないが、

一案としてテンポラリテーブルを作成してしまうと言う手はある。

CREATE TEMPORARY TABLE 検索結果
 ( id int  AUTO_INCREMENT PRIMARY KEY, 商品名 text , 商品価格 int )
SELECT NULL, 商品名, 商品価格 FROM 商品 ORDER BY 商品価格, 商品名

としておいてこのテンポラリテーブル対して検索をかければ検索は2回で済む。


もっとも、必要としている条件自体がちょっと複雑なので、たとえ SQL 一回で済んでも

実質はサブクエリなりで同等の検索処理を行うことになるとは思うが。

コメントはまだありません

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません