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

mysqlで同一商品コードの中から、最も価格が安い商品を抽出したいです。

例えば表1のデータがあった場合は、
『表1』
SHOUHIN_CD SHOUHIN_KBN SID SCODE RANKING PRICE
A02071409 2 wwww xkjkljlkjas 1 1772
A02071409 2 xxxx bbbbddd 1 1772
A02071409 1 wwww kljkj;lkjada 1 1772

『表2』のようにしたいです。価格が同じであれば、SHOUHIN_KBNが小さい順、かつ商品区分が同じ場合は、同ランキングにならないよう、HEX(SID)などしてどちらか一方を拾いたい
『表2』
SHOUHIN_CD SHOUHIN_KBN SID SCODE RANKING PRICE
A02071409 2 wwww xkjkljlkjas 2 1772
A02071409 2 xxxx bbbbddd 3 1772
A02071409 1 wwww kljkj;lkjada 1 1772

表1は、以下のSQLで抽出しました
SELECT
rr1.SHOUHIN_CD
,rr1.SHOUHIN_KBN
,rr1.STORE_ID
,rr1.CODE
,(SELECT COUNT(rr2.price) + 1 AS COUNT FROM SHOUHIN rr2
WHERE rr2.SHOUHIN_CD = rr1.SHOUHIN_CD
AND rr2.price < rr1.price
AND rr2.SHOUHIN_KBN < rr1.SHOUHIN_KBN
AND HEX(rr2.STORE_ID) < HEX(rr1.STORE_ID)
) AS RANKING
,rr1.price
FROM
shouhin rr1
ORDER BY rr1.SHOUHIN_CD
,price

SQLを教えてください。どうぞよろしくお願い致します。

●質問者: FujiiRock
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● うぃんど
●200ポイント ベストアンサー

(ステップ1)思い通りの順番に並べるクエリ

SELECT SHOUHIN_CD, SHOUHIN_KBN, STORE_ID, PRICE
FROM shouhin
ORDER BY SHOUHIN_CD, PRICE, SHOUHIN_KBN, STORE_ID
;

(ステップ2)ユーザー変数を付加してランク付け
SQLその1

SET @cd = '', @rank:=0;

SQLその2

SELECT SHOUHIN_CD, SHOUHIN_KBN, STORE_ID, PRICE
 , @rank := IF( @cd <> SHOUHIN_CD, 1, @rank + 1 ) AS RANK
 , @cd := SHOUHIN_CD
FROM shouhin
ORDER BY SHOUHIN_CD, PRICE, SHOUHIN_KBN, STORE_ID
;

その1、その2の2つのクエリを連続して実行させる必要があります。

(ステップ3)一位だけ抜き出し
SQLその1

SET @cd = '', @rank:=0;

SQLその2

SELECT SHOUHIN_CD, SHOUHIN_KBN, STORE_ID, PRICE, RANK
FROM (
 SELECT SHOUHIN_CD, SHOUHIN_KBN, STORE_ID, PRICE
 , @rank := IF( @cd <> SHOUHIN_CD, 1, @rank + 1 ) AS RANK
 , @cd := SHOUHIN_CD
 FROM shouhin
 ORDER BY SHOUHIN_CD, PRICE, SHOUHIN_KBN, STORE_ID
) r
WHERE RANK = 1
;

その1、その2の2つのクエリを連続して実行させる必要があります。


FujiiRockさんのコメント
ありがとうございます?? ご丁寧な解説に感謝します?? す、すみません、@変数を使わないで、行う方法ありますでしょうか(;゚0゚) ちなみに、レコードごとにユニークな連番であるshouhin_seqというカラムは存在しますが、こちらを活かしてできませんでしょうか^^;

うぃんどさんのコメント
>@変数を使わない (3)「最も価格が安い商品のみを出したい」だけ考えてみましたが、 最初にコメントしたとおり重くても知りませんよ…。 ランク付けについてはもっともっと複雑になるので、正直考えたくもないです^^; >|sql| SELECT a.SHOUHIN_CD, a.PRICE, a.SHOUHIN_KBN, a.STORE_ID FROM shouhin a WHERE (a.SHOUHIN_CD, a.PRICE, a.SHOUHIN_KBN, a.STORE_ID) = ( SELECT b.SHOUHIN_CD, b.PRICE, b.SHOUHIN_KBN, b.STORE_ID FROM shouhin b WHERE b.SHOUHIN_CD = a.SHOUHIN_CD ORDER BY b.SHOUHIN_CD, b.PRICE, b.SHOUHIN_KBN, b.STORE_ID LIMIT 1 ) ORDER BY a.SHOUHIN_CD ; ||<

FujiiRockさんのコメント
ありがとうございました! そうでしたね。。やはり負荷を考えると前者ですね。 前者の方で実装してみます!
関連質問

●質問をもっと探す●



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