2017-01-06 5 views
1

[迫害者の冒頭-1]私はこの質問が少なくとも10億回は答えられていることを知っていますが、私が求めているものに対するそれらの答えをモデル化しません。私はSQLの専門家ではない、確かだ。私は、SELECT、UPDATE、DELETE、eccのような古典的なコマンドだけで自信を持っています。だから、私を助けたい人に感謝します。私が行うには、私のクエリをしたいと思い何MIN()を使用してコードごとに1レコードのみを選択する(MySQL)

|----|--------|------------|----|----------|---------|---------|------| 
| id | code | category | mq | weight | weave | price | show | 
|----|--------|------------|----|----------|---------|---------|------| 
| 1 | DT450R | carbon | 1 | 450 | plain | 90 | 1 | 
| 2 | DT450R | carbon | 2 | 450 | plain | 40 | 1 | 
| 3 | DT450R | carbon | 5 | 450 | plain | 75 | 1 | 

| 4 | ZX300R | carbon | 1 | 300 | plain | 12 | 0 | 
| 5 | ZX300R | carbon | 15 | 300 | plain | 128 | 1 | 
| 6 | ZX300R | carbon | 30 | 300 | plain | 92 | 1 | 

| 7 | PP120Q | carbon | 3 | 120 | twill | 28 | 1 | 
| 8 | PP120Q | carbon | 7 | 120 | twill | 65 | 1 | 
| 9 | PP120Q | carbon | 9 | 120 | twill | 49 | 1 | 

は、各コードのために、選択することで、最低価格とだけ行:

は、のは、私はこのようなテーブルがあるとしましょうと言いました:

| 2 | DT450R | carbon | 2 | 450 | plain | 40 | 1 | 
| 4 | ZX300R | carbon | 1 | 300 | plain | 12 | 0 | 
| 7 | PP120Q | carbon | 3 | 120 | twill | 28 | 1 | 

最初の試みMIN() GIの説明に基づいてMySQL documentationにVENあるいは、少なくとも、)私はそれを理解し何に:ここSO上this answerに基づいて

$sql = 'SELECT code, weight, weave, MIN(price) 
     FROM products 
     WHERE category="carbon" AND show="1" 
     GROUP BY code 
     ORDER BY weight ASC'; 

第二の試み():

$sql = 'SELECT a.code, a.weight, a.price, a.weave 
     FROM products a 
     INNER JOIN 
     (
      SELECT code, weight, MIN(price) AS minprice, weave 
      FROM  products 
      GROUP BY code 
     ) 
     b ON a.code = b.code AND a.weave = b.weave AND a.price = b.minprice AND AND a.weight = b.weight 
     WHERE category="carbon" AND show="1" 
     ORDER BY a.weight ASC'; 

3回目の試み(ここではSOに基づいてthis other answerに基づく):

$sql = 'SELECT code, weight, weave, price 
     FROM products 
     INNER JOIN 
     (
      SELECT MIN(price) price, code, weight, weave 
      FROM products 
      GROUP BY code 
     ) 
     AS MIN ON MIN.code = products.code AND MIN.weight = products.weight AND MIN.weave = products.weave 
     WHERE category="carbon" AND show="1" 
     ORDER BY a.weight ASC'; 

これらの試みのどれも期待された結果を生み出したとは言えません。 3番目のメソッドは何かを出力し、残りの2つは0 matchesを返します。私は2番目と3番目の方法では、クエリにクエリを入れ子にしていますが、なぜそれらが機能しないのかわかりません。

+1

宿題ですが、少なくともあなたは試しています。 3回目の試行は正しいパスですが、派生テーブルのコードと分(価格)以外のものは必要ありません。コードとWHERE price = derived.price –

+1

の元のテーブルに結合できます。最も近い。しかし、サブクエリと 'ON'から' weave'と 'weight'を取り除いてください。 – Barmar

+0

結果に 'id = 4'が含まれているのはなぜですか?あなたのクエリは 'AND show =" 1 "'と言っています。その行には 'show =" 0 "'はありません。 – Barmar

答えて

2

もう一度お試しください。しかし、あなたが参加しなければならない列は、codepriceです。 weightおよびweaveは、この結合条件によって選択された行から取得されます。

SELECT a.code, a.weight, a.price, a.weave 
FROM products a 
INNER JOIN 
(
    SELECT code, MIN(price) AS minprice 
    FROM  products 
    GROUP BY code 
) 
b ON a.code = b.code AND a.price = b.minprice 
WHERE category="carbon" AND show="1" 
ORDER BY a.weight ASC 

これは、リンク先の質問の回答と同じです。それらのどれもON句に他の列を追加することを推奨していないので、どこから来たのか分かりません。

+0

これは間違っています。あなたがコードと価格に参加するので、あなたはidに参加する必要があります。そうしないと、結果に重複が生じる可能性があります。 –

+0

サブクエリはIDを返すことができないため、IDに参加できません。サブクエリでIDを選択すると、グループからランダムなIDが選択されます。同じコードで同じ最低価格を持つ2つの行がある場合にのみ、結果に重複を得ることができます。 – Barmar

+1

今、@ブリゴ、これが正解である理由を説明してください...あなたが理解を忘れている限り、私はあなたの宿題を手伝っても構いません。 –

関連する問題