2011-11-07 18 views
0
SELECT 
     bp.product_id,bs.step_number, 
     p.price, pd.name as product_name 
    FROM 
     builder_product bp 
     JOIN builder_step bs ON bp.builder_step_id = bs.builder_step_id 
     JOIN builder b ON bp.builder_id = b.builder_id 
     JOIN product p ON p.product_id = bp.product_id 
     JOIN product_description pd ON p.product_id = pd.product_id 
     WHERE b.builder_id = '74' and bs.optional != '1' 
    group by bs.step_number 
    ORDER by bs.step_number, p.price 

が、ここでは私の結果私は何を期待していないのですか?

88 1 575.0000 Lenovo Thinkcentre POS PC 
244 2 559.0000 Touchscreen with MSR - Firebox 15" 
104 3 285.0000 Remote Order Printer - Epson 
97 4 395.0000 Aldelo Lite 
121 5 549.0000 Cash Register Express - Pro 
191 6 349.0000 Integrated Payment Processing 
155 7 369.0000 Accessory - Posiflex 12.1" LCD Customer Display 

答えて

1

これは、GROUP BYの動作方法ではありません。列の数によって、あなたはグループ場合は、あなたの選択しか返すことができます:あなたのグループ

  • 列を、このようなMIN()、MAX()、AVG()などの他の列から
  • 集計機能、で... 。

だから、あなたがこれを行う必要があると思います:

SELECT 
    bs.step_number, 
    MIN(p.price) AS min_price, pd.name as product_name 
FROM 
    builder_product bp 
    JOIN builder_step bs ON bp.builder_step_id = bs.builder_step_id 
    JOIN builder b ON bp.builder_id = b.builder_id 
    JOIN product p ON p.product_id = bp.product_id 
    JOIN product_description pd ON p.product_id = pd.product_id 
    WHERE b.builder_id = '74' and bs.optional != '1' 
group by bs.step_number, pd.name 
ORDER by bs.step_number, min_price 

(MySQLは非常にリラックスした構文を可能にし、喜んでグループごとにランダムな行を削除しますが、他のDBMSはあなたの元のクエリでエラーがトリガされます。)

+0

私は 'イチゴquery'ためにGoogle、そのために – Trace

+0

.....これを試してみましたが、これは私のproduct_idを与えるdoesntの。しかし、GROUP BYがどれほど平易であるかを理解してください。 – Trace

+0

同様分の価格のそれぞれのためのproduct_idが必要 –

0

はいです。グループキーごとに1回だけ返されます。この問題は簡単に解決できません。 2つの異なるクエリを実行し、後で結果を結合します。これがオプションでない場合は、各ステップの最低価格の一時テーブルを作成して、クエリのテーブルを結合します。

1

は、この例では、各グループ

の最小値を含む表の選択部分に参加します。 mygroup min(amt)は、グループの最低ドル項目を返します。

これをメインテーブルに戻して、完全な内部結合としてレコードをその最小値に制限します。

Select A.myGROUP, A.Amt 
from mtest A 
    INNER JOIN (Select myGroup, min(Amt) as minAmt from mtest group by mygroup) B 
    ON B.myGroup=A.mygroup 
    and B.MinAmt = A.Amt 
関連する問題