Mysql complex update syntax

I have a table with pairs of records, each can be tied together via an ID number.  Each pair has a time value where 1 record might be the same or later in time than its pair.  I want to update the check_time field where the newer time = 'Y' and the older time can stay the default 'N'.  If the times are the same, I want to use a different field that happens to be boolean (0,1) to determine the check_time field, something like if boolean_field = 0 set check_time = 'Y'

I'll try to create sample table data in code section.
record | shared_id | boolean_field | time | check_time
1      |  25       |  0            | 3:01 | Y
2      |  25       |  1            | 3:00 | N

Open in new window

Who is Participating?
cyberkiwiConnect With a Mentor Commented:
Because of your complex tiebreak - time, then boolean_field, a 3 level subquery is required.
Please see below.
update qm
left join
select q3.record
from (
	select q2.shared_id, MT.maxtime, Min(q2.boolean_field) minbool
	from (
		select shared_id, max(time) maxtime
		from qm q1
		group by shared_id) MT
	inner join qm q2 on q2.shared_id=MT.shared_id and q2.time=MT.maxtime
	group by q2.shared_id, MT.maxtime) mb
inner join qm q3 on mb.shared_id=q3.shared_id and mb.maxtime=q3.time and mb.minbool=q3.boolean_field
) qx on qx.record=qm.record
set check_time = case when qx.record is null then 'N' else 'Y' end

Open in new window

Kevin CrossChief Technology OfficerCommented:
Here is another approach that might help:

create table qm(record int,shared_id int,boolean_field tinyint(1),`time` time, check_time char(1));

insert into qm
values(1, 25, 0, '03:01', 'N'),
(2, 25, 1, '03:00', 'N');

Might be same was what cyberkiwi is doing above, I haven't checked...
update qm q1
join (
   select shared_id, max(`time`) as max_time
   from qm 
   group by shared_id
) q3 on q1.`time` = q3.max_time
   and q3.shared_id = q1.shared_id
join qm q2 on q2.shared_id = q1.shared_id
   and q2.record <> q1.record
set q1.check_time = 
      when (q1.`time` > q2.`time`) 
        or (q1.`time` = q2.`time` and q1.boolean_field = 0) 
        then 'Y' 
      else 'N' 

Open in new window

mcgilljdAuthor Commented:
That was awesome!
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.