如何根据子查询内ID最大的一条数据对另一个表内的数据进行更新

其中,tml是一个表 tmal是一个子查询的结果(返回多条数据),需要从tml内获取到media_id,

需要从tmal中经过时间筛选、media_id筛选 后,选择id最大的数据,对tml内对应的相同时间,media_id进行更新。

tmal筛选后会得到多条数据,现在的写法无论如何都是按照子查询结果中id最小的数据进行更新的,现在求帮忙改写成按子查询中id最大的数据进行更新,感谢感谢

UPDATE t_middlelog AS tml,
 (
    SELECT
        *
    FROM
        t_machinelog
    WHERE
        TO_DAYS(NOW()) - TO_DAYS(log_date) = 1
    ORDER BY id DESC
) AS tmal
SET tml.machine_guid = tmal.machine_guid,
 tml.mac_id = tmal.macid,
 tml.log_ip = tmal.log_ip,
 tml.media_type = tmal.channel_type,
 tml.media_name = tmal.channel_name,tml.detail0 = tmal.tmal.detail0,
 tml.detail1 = tmal.tmal.detail1,
 tml.detail2 = tmal.tmal.detail2,
 tml.edition0 = tmal.tmal.edition0,
 tml.edition1 = tmal.tmal.edition1,
 tml.edition2 = tmal.tmal.edition2,
 tml.org_id=tmal.id 
WHERE tml.media_id = tmal.channel_id and TO_DAYS(NOW()) - TO_DAYS(tml.log_date) = 1;

你的子查询没有查询出最大的一条id记录吧。
你单独执行子查询得到的结果应该是多条记录。

按照您的知道我尝试写了一个存储过程,但是这个存储过程运行的实在过于缓慢,您可以帮忙指导一下原因吗?运行了快20分钟都不结束


CREATE DEFINER=`root`@`%` PROCEDURE `newUpdate`()
BEGIN
    DECLARE
        flag INT DEFAULT 0;
DECLARE
    ida INT;

DECLARE
    COUNTA INT DEFAULT 1;

DECLARE
    idList CURSOR FOR (
        SELECT
            media_id
        FROM
            backstage_db.t_media tm
        WHERE
            tm.media_type = 0
        OR tm.media_type = 1
    );

DECLARE
    CONTINUE HANDLER FOR NOT FOUND
SET flag = 1;

OPEN idList;

FETCH idList INTO ida;


WHILE flag != 1 DO
SET COUNTA =1;
   WHILE COUNTA < 5 DO
UPDATE t_middlelog AS tml,
 (
    SELECT
        *
    FROM
        t_machinelog
    WHERE
        TO_DAYS(NOW()) - TO_DAYS(log_date) = COUNTA
    and channel_id=ida
    ORDER BY id DESC LIMIT COUNTA
) AS tmal
SET tml.machine_guid = tmal.machine_guid,
 tml.mac_id = tmal.macid,
 tml.log_ip = tmal.log_ip,
 tml.media_type = tmal.channel_type,
 tml.media_name = tmal.channel_name,tml.detail0 = tmal.tmal.detail0,
 tml.detail1 = tmal.tmal.detail1,
 tml.detail2 = tmal.tmal.detail2,
 tml.edition0 = tmal.tmal.edition0,
 tml.edition1 = tmal.tmal.edition1,
 tml.edition2 = tmal.tmal.edition2,
 tml.org_id=tmal.id 
WHERE tml.media_id = ida and TO_DAYS(NOW()) - TO_DAYS(tml.log_date) = COUNTA;
SET COUNTA = COUNTA + 1;
        END WHILE;

FETCH idList INTO ida;


END
WHILE;

CLOSE idList;


END