2017-08-12 7 views
0

別のMySQLの価格&株式の比較は(MySQL price & stock comparison私は私のオリジナルのポストからのフォローアップの質問を持って

は、私はTABLE1には、次の列を含む持っているとしましょう。

TABLE1(生データ、何ら修正が行われていない)

|item |partnumber |supplier |stock |cost 
CD  11A   West  11  10.11 
CD  11A   East  0  10.00 
USB  BBB   North  1  125.01 
USB  BBB   West  1  101.10 

TABLE1(かかわらず、それが在庫にあるかどうかの製品の最も安い価格とショーサプライヤ - WORKING)

CODE 
====== 
SELECT a.name , a.partnumber , a.supplier , a.cost FROM table1 a JOIN (
SELECT name , partnumber , MIN(cost) cost 
FROM table1 
GROUP BY name , partnumber) 
b ON a.name = b.name AND a.cost = b.cost AND a.partnumber = b.partnumber 


RESULT 
====== 
|item |partnumber |supplier |stock |cost 
CD  11A   East  0  10.00 
USB  BBB   West  1  101.10 

しかし、私が達成したいのは次のとおりです:

サプライヤーが在庫切れの場合は、価格が安くないかもしれませんが、在庫がある商品を持っている他のサプライヤーを表示してください。 (2番目に安い、3番目に安いなど) - 在庫がない商品がある場合は、関係なく安い価格で商品を表示してください。

要するに、商品を在庫したことが価格よりも優先されます(しかし、それでも商品の最も安い価格でなければなりません)が、誰もその商品を持っていない場合は、 。

ありがとうございます。

答えて

0

これは優先順位付けのクエリです。他のデータベースでは、row_number()を使用します。これはMySQLのオプションではありません。

これを行う1つの方法は、変数を使用します。ここでもう一つの方法は次のとおりです。

select t1.* 
from table1 t1 
where t1.supplier = (select tt1.supplier 
        from table1 tt1 
        where tt1.partnumber = t1.partnumber 
        order by (stock > 0) desc, -- put those with stock first 
           price asc 
        limit 1 
        ); 

変数を使用した方法は次のとおりです。

select t1.* 
from (select t1.*, 
      (@rn := if(@pn = partnumber, @rn + 1, 
         if(@pn := partnumber, 1, 1) 
         ) 
      ) as rn 
     from table1 t1 cross join 
      (select @pn := '', @rn := 0) params 
     order by partnumber, (stock > 0) desc, price 
    ) t1 
where rn = 1; 
+0

はありがとうございました! – Johnny

関連する問題