Search code examples
mysqlsqlsql-updateinner-joinwhere-clause

SQL update multiple table using inner join


I have three tables "batch", "batchyield", "batchsop"

BATCH

|----------|--------------|----------------|-------|
| batch_id | batch_status | actual_produce | stage |
|----------|--------------|----------------|-------|

BATCHYIELD

|--------------|----------------|
|   batch_id   | actual_harvest |
|--------------|----------------|

BATCHSOP

|--------------|----------------|
|   batch_id   | current_status |
|--------------|----------------|

I am trying to update two tables at a time they all are connected with a foreign key I have written a SQL query for that

UPDATE b SET
b.batch_status = 'completed', b.stage = 'flowering', 
b.actual_produce = SUM(byl.actual_harvest), 
bsop.current_status='3' 
from igrow.farm_management_batch b
INNER JOIN igrow.farm_management_batchyield byl ON b.id = byl.batch_id
INNER JOIN igrow.sop_management_batchsopmanagement bsop ON b.id = bsop.batch_id
WHERE end_date < "2022-07-10 00:00:00.000000" and end_date is not null and (batch_status = "running" or batch_status = "to_start")

BUT It says the query is wrong


Solution

  • UPDATE igrow.farm_management_batch b
    INNER JOIN ( SELECT batch_id, SUM(actual_harvest) actual_harvest
                 FROM igrow.farm_management_batchyield
                 GROUP BY batch_id ) byl ON b.id = byl.batch_id
    INNER JOIN igrow.sop_management_batchsopmanagement bsop ON b.id = bsop.batch_id
    
    SET b.batch_status = 'completed', 
        b.stage = 'flowering', 
        b.actual_produce = byl.actual_harvest, 
        bsop.current_status='3' 
    
    WHERE end_date < "2022-07-10 00:00:00.000000" 
    -- and end_date is not null 
      AND b.batch_status IN ("running", "to_start")
    

    end_date is not null is excess (if previous is true then this is true too), commented.

    PS. There is no end_date column in shown tables - where it is taken from?