6

しばらくウェブを見回していて、私が欲しいものに似たものに出くわすことができないようです。私はそれが私のクエリを書いている方法と関係があることを知っていますが、どんな助けもいただければ幸いです。

私がやろうとしていることの基本は次のとおりです。

  • アイテムが存在しない場合は、テーブルにいくつかのアイテムを挿入します
  • アイテムが存在する場合は更新します

次の形式で存在します。

名前、バーコード、アイテム、数量、場所、価格、日付

名前-複数の行で使用できますバーコード-特定のアイテム用ですが、複数の場所として使用できますアイテム-バーコードと同じですが、名前の数量が含まれています-自明の場所-これは異なる場所の価格である可能性があります-に添付されています特定のアイテムの日付-そのアイテムが最後に購入された時刻

トリッキーなことは、「名前」には、さまざまな場所にさまざまな価格で複数のアイテム(バーコードとアイテム)を含めることができるということです。顧客は、設定された時間に商品を購入した金額を確認できるため、商品を販売するために必要な金額を知ることができます。

ただし、購入した価格は変動する可能性があるため、価格が前回の購入と異なる場合は、テーブルに別の行を作成する必要があります。

全体の背後にある考え方は、各場所での各アイテムの「名前」の量を記録し、次に購入した価格と最後に購入した日時を記録することです。

それが理にかなっていることを願っています。

疑似コードの場合:

    Insert into table if does not exist
    - name, barcode, item, quantity, location, price and date
    If name, barcode, item, location and price are the same
    - Update quantity and date (if more recent)
4

3 に答える 3

14
于 2013-01-10T13:48:07.083 に答える
5

mysqlで置換構文を使用できます。

しかし、それは一意である必要があるフィールドの一意のインデックスでのみ機能します。

したがって、次のような一意のインデックスを作成する必要があります。

alter <yourtable> add unique index(name, barcode, item, location, price);

次に、挿入/更新構文は次のようになります

replace into <yourtable> (name, barcode, item, quantity, location, price, date)
 VALUES('name1', 'barcode1', 2, 'location1', 12.0, '25/12/2012');

編集

ストアド プロシージャの例 (簡略化され、テストされていない) :

DELIMITER &&
DROP PROCEDURE IF EXISTS MyBase.UpdateOrInsert $$
CREATE PROCEDURE MyBase.UpdateOrInsert
(
  IN _name VARCHAR(10),
  IN _barcode VARCHAR(50),
  IN _quantity INTEGER
  IN _date DATE
)

DECLARE existingDate DATE default NULL;
BEGIN

SELECT date 
INTO existingDate
FROM <yourTable> where name = _name and barcode = _barcode;

if (existingDate IS NULL) then
   insert into <yourtable> (name, barcode, quantity, date) VALUES(_name, _barcode, _qantity, _date);
else
  if (existingDate < _date) then
     update <yourtable> 
     set quantity = _quantity,
       date = _date
     where name = _name
     and   barcode = _barcode;
  end if;
end if;
END &&
于 2013-01-10T13:48:24.150 に答える
1

上記の人々からのすべての助けのおかげで、最終的に見つけた解決策は両方に非常に近かった. 以下で見つけてください:

INSERT INTO `stock`
    (name, barcode, item, quantity, location, price, date)  
VALUES
    (?,?,?,?,?,?,?)                         
ON DUPLICATE KEY UPDATE
     quantity = CASE WHEN 
                VALUES(date) < $date
                THEN quantity + $quantity
                ELSE quantity 
                END,
    date = CASE WHEN 
                VALUES(date) < $date
                THEN VALUES(date)
                ELSE $date
                END
于 2013-01-11T09:59:45.630 に答える