人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLについて質問です。

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

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

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

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

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

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

●質問者: black_kenchan
●カテゴリ:ウェブ制作
✍キーワード:23 MySQL クエリ ソート データ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● HALSPECIAL
●27ポイント

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

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

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

が、

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

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


2 ● kn1967
●27ポイント

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


先の質問では、

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

今回の質問文によると、

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

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

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

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


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

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

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

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

あるいは

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

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

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


3 ● b-wind
●26ポイント

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

これと

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

それに、現在は、選択したレコードの呼び出し、前、後ろと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 一回で済んでも

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ