2017-06-11 23 views
-2

私はMYSQLを初めて使い、2つのテーブルを結合して一意の製品行を返すクエリを作成するのに苦労しています。2つのテーブルとGROUPを共通の列で結合する

TABLEproduct

╔══════════════════════════════╦══════════╦════════════╦════════════════════╗ 
║    ref    ║ brand ║ mpn  ║  sku   ║ 
╠══════════════════════════════╬══════════╬════════════╬════════════════════╣ 
║ 0001___DOGICLON___912-101242 ║ DOGICLON ║ 912-101242 ║ 000000000001082649 ║ 
║ 0002___DOGICLON___912-101242 ║ DOGICLON ║ 912-101242 ║ 912-101242   ║ 
║ 0003___Dogiclon___912-101242 ║ Dogiclon ║ 912-101242 ║ 912-101242(R400) ║ 
║ 0005___Dogiclon___912-101242 ║ Dogiclon ║ 912-101242 ║ MILT-R400   ║ 
╚══════════════════════════════╩══════════╩════════════╩════════════════════╝ 

TABLEinventory

╔══════════════════════════════╦═══════╦═════════╦══════════╗ 
║    ref    ║ scost ║ instock ║ location ║ 
╠══════════════════════════════╬═══════╬═════════╬══════════╣ 
║ 0001___DOGICLON___912-101242 ║ 53.68 ║  24 ║ WA  ║ 
║ 0001___DOGICLON___912-101242 ║ 53.68 ║  0 ║ CA  ║ 
║ 0002___DOGICLON___912-101242 ║ 61.00 ║  121 ║ WA  ║ 
║ 0003___Dogiclon___912-101242 ║ 53.53 ║  100 ║ WA  ║ 
║ 0003___Dogiclon___912-101242 ║ 53.53 ║  0 ║ NY  ║ 
║ 0003___Dogiclon___912-101242 ║ 53.53 ║  20 ║ MA  ║ 
║ 0003___Dogiclon___912-101242 ║ 53.53 ║  2 ║ CA  ║ 
║ 0005___Dogiclon___912-101242 ║ 56.00 ║  5 ║ IN  ║ 
║ 0005___Dogiclon___912-101242 ║ 56.00 ║  5 ║ MA  ║ 
║ 0005___Dogiclon___912-101242 ║ 56.00 ║  5 ║ WA  ║ 
║ 0005___Dogiclon___912-101242 ║ 56.00 ║  5 ║ NY  ║ 
║ 0005___Dogiclon___912-101242 ║ 56.00 ║  2 ║ CA  ║ 
╚══════════════════════════════╩═══════╩═════════╩══════════╝ 

私はpseduoコードは次のようになり推測:

SHOW all products 
WHERE 
    instock (any location) > 0 AND 
    (cost > 10 AND cost < 2000) 
ORDER BY 
    cost asc 

ノート

╔══════════╦══════════╦════════════╦══════════════╦══════════════╦═══════════════════════════╗ 
║ ref ║ brand ║ mpn  ║  sku  ║ scost  ║   instock   ║ 
╠══════════╬══════════╬════════════╬══════════════╬══════════════╬═══════════════════════════╣ 
║ whatever ║ Dogiclon ║ 912-101242 ║ based on ref ║ based on ref ║ based on ref and location ║ 
╚══════════╩══════════╩════════════╩══════════════╩══════════════╩═══════════════════════════╝ 

これは何です:

  • ref sが
  • brandmpn検索が鈍感な

期待される結果 ケースにする必要があるサプライヤーごとに一意です私はtrですying:

SELECT DISTINCT 
    product.ref, 
    product.brand, 
    inventory.scost, 
    inventory.instock 
FROM 
    product 
    JOIN inventory ON inventory.ref = product.ref 
WHERE 
    inventory.instock > 1 
    AND (app.inventory.scost >= 10 AND app.inventory.scost <= 2000) 
GROUP BY 
    product.ref 
+1

予期せぬ結果がデータに含まれているため、サンプルデータと期待される結果を表示する必要があります。私の推測では、1つの製品refに関連付けられたインベントリテーブル内に複数のレコードがあることです。 – Shadow

+0

@ Shadowああ、商品には重複した参考文献はありませんが、在庫は – 3zzy

答えて

0

参考になると思われる製品内のユニークな列でグループ化している場合、別個のものは望むことはできません。 DISTINCTは、返される行ごとに一意性を処理します(すべての値が返されます)。あなたは確実にしたい場合は

SELECT 
    product.ref, 
    product.mfr, 
    group_concat(inventory.scost) as scost, 
    group_concat(inventory.instock) as instock, 
FROM 
    product 
    JOIN inventory ON inventory.ref = product.ref 
WHERE 
    inventory.instock > 1 
    AND (app.inventory.scost >= 10 AND app.inventory.scost <= 2000) 
GROUP BY 
    product.ref, product.mfr 

:あなたは、明確な部分を落とし、以下のようにして集計非グループ化列によってグループにproduct.mfrを追加する必要があると思いREFこの場合、製品ごとに結果に1行を取得しますscostとinstockの正しい順序は、group_concat自体の中にordering句を含めるだけです。すなわち、

group_concat(column order by column1, [...]) 
+0

です。私は質問とあなたの答えの否定を理解していません。それはうまくいくように見えましたが、私はMySQLを学んでいるだけなので、group_concatとそれがどのように動作するかについてもっと読む必要があります。ありがとう! – 3zzy

+0

@ 3zzyそれから私に説明させてください。あなたは何が問題なのか説明できなかったので質問には下線が表示されたので、あなたが尋ねたことは不明です。この回答は、野生の推測であり、この野生の推測が実際に正しいのであれば、問題は重複しており、そのように閉じなければならないので、下降表が得られました。 – Shadow

+0

@Shadow十分に、私はすべての詳細で説明を更新しました。私はこの答えが私の場合には機能するのかどうかはわかりませんが、一意の行を返します。 – 3zzy

関連する問題