1

3 つのフィールド (item_id、source、および price) を持つテーブルがあります。(item_id、source、および price) が一緒になって主キーを構成します。

item_id    source      price
-------    -------     -----
1          paris       13
1          london      12
1          newyork     15
2          paris       22
2          london      15
2          newyork     14

item_id ごとに、それを入手するのに最も安い場所と、その場所で支払う価格を知りたいです。上記の例について、次の出力を確認したいと思います。

item_id    source     price
-------    -------    ---------
1          london     12
2          newyork    14

テーブル名を2回言及せずにこれを行う簡単な方法はありますか? MySQL を使用しているため、WITH 句を使用できません。

別のユーザーの質問 ( Group related records, but pick specific fields from only the first record ) で結合された 2 つのクエリ ソリューションを見てきましたが、テーブルについて 2 回言及することは本当に避けたいと思います。問題は、この質問の単純なテーブルが、実際の問題では、使用ごとに作成するのに約 5 秒かかるインライン ビューを実際に表していることです。そのため、代替案を見つけたいと考えています。

4

2 に答える 2

3

これが1つの方法で、内部結合を使用して最低価格の行をフィルタリングします。

select i.* 
from items i
inner join (
    select item_id, min(price) as minprice
    from items 
    group by item_id
) cheapest on i.price = cheapest.minprice
    and i.item_id = cheapest.item_id

最低価格のソースが複数ある場合は、それらがすべて表示されます。

編集:あなたの質問はアイテムビューが構築するのに時間がかかると述べているので、あなたは一時的なテーブルに結果を保存することができます。

create temporary table temp_items 
as 
select item_id, source, price from YourView

次に、一時テーブルでグループ化クエリを実行します。MySQLでは、一時テーブルは現在の接続にのみ表示され、接続が閉じられると自動的に削除されます。

于 2009-11-14T15:13:52.797 に答える
0

残念ながら、MySQL のデータと文字列の変換については暗記していません。しかし、正しい構文に少し手を加えると、次のように驚くかもしれません。

SELECT
   item_id,
   source = Convert(varchar(30), Substring(packed, 5, 30)),
   price = Convert(int, Substring(packed, 1, 4))
FROM
   (
      SELECT
         item_id,
         Min(Convert(binary(4), price) + Convert(varbinary(30), source) AS packed
      FROM items
      GROUP BY item_id
   ) X

これは確かにハックです。すべての場合に使用するべきではありません。しかし、パフォーマンスが重要な場合は、それだけの価値がある場合もあります。

詳細については、このスレッドを参照してください。

于 2010-09-02T08:18:19.570 に答える