2016-07-26 14 views
0

3つのテーブル間の2対1の関係で、dbの一部のフィールドを更新する際に助けが必要です。1対多のリレーションシップを更新する

多くのboxには多くのfruitsを持つ現在の設定farmerがあります。

各農家が日中waranty期間(int型の列)が、それぞれの果実は有効期限があります(つまり、配信期間NOW() - fruit.expiry_date > farmer.daysに依存)

私の目標は、期限切れとしてボックスを設定することですが、場合にのみ箱の中の果物はすべて期限切れです。

これは私が終わったものです:

UPDATE 
    boxes 
SET 
    expired = true 
WHERE id IN (
    SELECT 
     boxes.id 
    FROM 
     fruit, boxes, farmer 
    WHERE 
     fruit.box_id = boxes.id AND 
     boxes.farmer_id = farmer.id AND 
     DATE_PART('day', now() - fruit.expiry_date) > farmer.waranty_days AND 
     boxes.expired = FALSE 
) 

問題は、私が捕まってしまったということで、すべての果物の期限が切れていないボックスを除外する方法については考えています。 また、カウントを追加しようとしましたが、結果を残して残しましたが、まだ正常に動作していませんでした。

アドバイスをよろしくお願いいたします。

答えて

0

問題の考え方が違うのは、新鮮な果実を含まない箱を識別したいということです。このような何かを試してみてください:

UPDATE boxes 
INNER JOIN farmer ON boxes.farmer_id = farmer.id 
SET boxes.expired = true 
WHERE NOT boxes.expired 
AND NOT EXISTS (
    SELECT 1 
    FROM fruit 
    WHERE boxes.id = fruit.box_id 
    AND DATE_PART('day', now() - fruit.expiry_date) <= farmer.waranty_days 
) 

同じことをすべきもう一つのクエリ:

UPDATE boxes 
INNER JOIN farmer ON boxes.farmer_id = farmer.id 
LEFT JOIN fruit ON boxes.id = fruit.box_id 
       AND DATE_PART('day', now() - fruit.expiry_date) <= farmer.waranty_days 
SET boxes.expired = true 
WHERE NOT boxes.expired AND fruit.id IS NULL 
関連する問題