user3535795
user3535795

Reputation: 53

MySQL update column value with max value from another column

I have a database with 2 tables: "services" and "service_performance" Those 2 tables have a SERVICE_ID column.

In "services" the SERVICE_ID values are unique (each service has a single ID/entry). In "service_performance" there is an AVERAGE_MEMORY column with multiple entries per service_id

I am trying to update the MAX_VALUE column in "services" table with the highest AVERAGE_MEMORY value taken from the "service_performance" table.

I know my query is wrong because it throws an error:

1054 - Unknown column 'service_performance.SERVICE_ID' in 'where clause'

While 'service_performance.SERVICE_ID' does exist.

Here is my query:

   update _services
set MAX_VALUE = (SELECT MAX(AVERAGE_MEMORY) AS SERVICE_ID FROM service_performance)
where exists 
  (select *
  from services 
  where `services`.`SERVICE_ID` = `service_performance`.`SERVICE_ID`);

Upvotes: 1

Views: 3850

Answers (3)

Gordon Linoff
Gordon Linoff

Reputation: 1270523

You should find that this version works in MySQL:

update services s join
       (select service_id, MAX(AVERAGE_MEMORY) as maxmem
        from service_performance
        group by service_id
       ) sp
       on s.service_id = sp.service_id
    set s.MAX_VALUE = sp.maxmem;

Your version would work if it had the right table name in the where clauses:

update services
    set MAX_VALUE = (SELECT MAX(AVERAGE_MEMORY) AS SERVICE_ID
                     FROM service_performance
                     WHERE `services`.`SERVICE_ID` = `service_performance`.`SERVICE_ID`)
    where exists (select *
                  from service_performance 
                  where `services`.`SERVICE_ID` = `service_performance`.`SERVICE_ID`
                 );

I am assuming that update _services is a typo and should really be update services.

Upvotes: 2

Nick
Nick

Reputation: 679

I don't have a database to test on, but firstly you haven't given the subquery an alias, so it doesn't know what service_performance.Service_ID is.

Secondly, in this context the subquery needs to return a single value rather than a table, so you may not be able to reference it. If adding the alias to the subquery doesn't work, then something like the following should work:

update _services
set MAX_VALUE = (SELECT MAX(AVERAGE_MEMORY) AS SERVICE_ID FROM service_performance
                 INNER JOIN
                 services
                 on services.SERVICE_ID = service_performance.SERVICE_ID)

Upvotes: 0

CodeBird
CodeBird

Reputation: 3858

MySQL is complaining because in this query there is no service_performance table

Try it like this:

   UPDATE _services s INNER JOIN service_performance p
   ON s.SERVICE_ID=p.SERVICE_ID
   SET s.MAX_VALUE=MAX(p.AVERAGE_MEMORY) GROUP BY p.SERVICE_ID

Upvotes: 0

Related Questions