其中,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