2016-07-26 27 views
0

Ich brauche Hilfe bei der Aktualisierung einiger Felder in der Datenbank in zwei Eins-zu-viele-Beziehungen zwischen 3 Tabellen.Aktualisierung einer zu vielen Beziehung

Ich habe die aktuelle Einrichtung farmer, die viele box hat, die viele fruits haben.

Jeder Bauer hat einen waranty Zeitraum in Tagen (int Spalte), jede Frucht hat ein Ablaufdatum (das hängt von der Lieferzeit NOW() - fruit.expiry_date > farmer.days)

Mein Ziel ist es, die Box zu setzen, wie abgelaufen, aber nur, wenn alle Früchte in der Box sind abgelaufen.

Dies ist, was ich mit endete haben:

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 
) 

Das Problem ist, dass ich stecken geblieben, und haben keine Ahnung, wie die Boxen auszuschließen, dass alle Früchte nicht abgelaufen haben. Ich habe auch versucht, eine Zählung hinzuzufügen, dann links verbinden das Ergebnis, aber immer noch nicht richtig funktioniert.

Jeder Rat ist willkommen.

Antwort

0

Eine andere Art zu denken über das Problem ist, dass Sie Boxen, die keine frischen Früchte enthalten, identifizieren möchten. Probieren Sie etwas wie folgt aus:

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 
) 

Eine andere Frage, die das gleiche tun sollten:

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 
Verwandte Themen