1

いくつかの割引が適用される可能性があるため、mysql がショップアイテムに対して最も具体的な割引を返すようにしようとしています。私のテーブルとデータは次のとおりです(関係のない列は省略されています):

Item
  itemId   brand    supplier   price
  ======   =====    ========   =====
  Item1    Brand1   Supply1    100
  Item2    Brand2   Supply1    100
  Item3    Brand3   Supply1    100
  Item4    Brand4   Supply2    100

Discount
  discountId   itemId   brand    supplier   discountPrice
  ==========   ======   ======   ========   =============
  Discount1    (null)   (null)   Supply1    80
  Discount2    (null)   Brand2   Supply1    60
  Discount3    Item3    (null)   (null)     40

そして、クエリの期待される出力は次のようになります

itemId  price  discountPrice
===================================
Item1   100    80
Item2   100    60
Item3   100    40
Item4   100    (null)

ご覧のとおり、私のルールは

  1. サプライヤの割引は具体的ではありません
  2. サプライヤー+ブランドの割引はより具体的です
  3. ItemId 割引が最も具体的です

ただし、句との通常の左結合では、最も具体的な割引ではなく、すべての組み合わせが返されます。どうすればこれを達成できますか?

select item.itemId, item.price, discount.discountPrice from item left join discount on (item.itemId = discount.itemId) or (item.brand = discount.brand and item.supplier = discount.supplier) or (item.supplier = discount.supplier AND discount.brand IS NULL)

4

2 に答える 2

1

クエリ:

SQLFIDDLEEXサンプル

SELECT i.itemId, 
       i.price, 
       COALESCE(d.discountPrice, d2.discountPrice, d3.discountPrice) AS discountPrice 
FROM item i
LEFT JOIN discount d 
  ON i.itemId = d.itemId
LEFT JOIN discount d2
  ON i.brand = d2.brand
  AND i.supplier = d2.supplier 
LEFT JOIN discount d3
 ON i.supplier = d3.supplier 
 AND d3.brand IS NULL

結果:

| ITEMID | PRICE | DISCOUNTPRICE |
----------------------------------
|  Item1 |   100 |            80 |
|  Item2 |   100 |            60 |
|  Item3 |   100 |            40 |
|  Item4 |   100 |        (null) |
于 2013-07-11T08:41:27.530 に答える
0

3 つの割引すべてに個別の左結合を使用し、それらから最も具体的なものを選択します。

Select 
    i.itemId, 
    i.price,
    coalesce(spec3.discountPrice, spec2.discountPrice, spec1.discountPrice)
from item i
left join Discount spec3 on (i.itemId = spec3.itemId)
left join Discount spec2 on (i.supplier = spec2.supplier and i.brand = spec2.brand)
left join Discount spec1 on (i.supplier = spec1.supplier)

上記のクエリには構文エラーが含まれている可能性があります。実際に実行できる mysql サーバーが近くにありません。

于 2013-07-11T08:37:53.640 に答える