Mysql变量和循环
我编写mysql查询。我需要获得两个表之间的差异,在第3个表中插入该差异,并在第4个表中更新数据。我有这个问题吗?当我尝试在数据库中更新时,只更新最后一个值Mysql变量和循环,mysql,loops,variables,Mysql,Loops,Variables,我编写mysql查询。我需要获得两个表之间的差异,在第3个表中插入该差异,并在第4个表中更新数据。我有这个问题吗?当我尝试在数据库中更新时,只更新最后一个值 INSERT INTO requests_files_rel (SELECT @cnt:=COUNT(id_request) @id_req:=id_request,@id_file:=id_file FROM requests_mandates_rel WHERE id_file NOT IN (SELECT id_file
INSERT INTO requests_files_rel
(SELECT @cnt:=COUNT(id_request) @id_req:=id_request,@id_file:=id_file
FROM requests_mandates_rel WHERE id_file NOT IN (SELECT id_file FROM requests_files_rel));
UPDATE files_main SET id_patient = (SELECT @id_patient:=id_patient FROM requests_main
WHERE id_request=@id_req)
WHERE id_file IN (@id_file);
永远不要使用这种查询。也许有人能告诉我解决问题的方法。谢谢。试着像这样改变顺序
SELECT COUNT(id_request) INTO @cnt
注意:一个变量中只能存储一个值。所以在你的问题中,你说你只更新了最后一个值。。这可能是因为您有一个AGGREGATE COUNT(),它将所有行合并为一行。。除非你用一个小组。。。但是,您的变量无法处理多行数据
如果要使用变量进行此操作,则需要进行一些更改
SELECT COUNT(id_request) as num_req , id_request, id_file
FROM requests_mandates_rel
WHERE id_file NOT IN (SELECT id_file FROM requests_files_rel)
GROUP BY id_file
选择此选项,它将给出每个文件的计数,然后对其执行此操作
SELECT GROUP_CONCAT(num_req) INTO @cnt,
GROUP_CONCAT(id_request) INTO @id_req,
GROUP_CONCAT(id_file) INTO @id_file
FROM
( SELECT COUNT(id_request) as num_req , id_request, id_file
FROM requests_mandates_rel
WHERE id_file NOT IN (SELECT id_file FROM requests_files_rel)
GROUP BY id_file
)t
现在要使用concated值,必须使用FIND_IN_SET()
我很好奇你是否应该首先使用变量。。。你就不能这样做吗
INSERT INTO requests_files_rel (column_for_count, column_for_requestid, column_for_fileid)
( SELECT COUNT(id_request), id_request, id_file
FROM requests_mandates_rel
WHERE id_file NOT IN (SELECT id_file FROM requests_files_rel)
);
UPDATE files_main fm,
( SELECT id_patient
FROM requests_main
WHERE id_request IN
( SELECT id_request
FROM requests_mandates_rel
WHERE id_file NOT IN (SELECT id_file FROM requests_files_rel)
)
) t
SET fm.id_patient = t.id_patient
WHERE fm.id_file IN (@id_file);
这是我的最终版本,一切正常,谢谢你的帮助。当我运行修复代码时,我有一个错误。Maby Mysql有处理循环的函数吗?我无法将数组保存到Mysql变量?@kickman2l请看我所做的编辑您无法将数组保存到Mysql变量它只包含一个标量值。。。因此,您必须将行合并为一个包含组的行。。。然后使用find_in_set()将它们从逗号分隔的列表中拉出来。稍后将尝试一些,非常大的数据库需要时间才能将其重新获取。也谢谢。我更改了查询,发现了另一个问题。当我尝试使用(@id_文件)中mysql只从具体值中取第一个值的条件时,如果我手动输入该值,则查询效果很好。@kickman2l您可以再次选择它们。。我只是想减少开销。。只需将
@id_文件
更改为针对这些特定文件的选择。或者最好把它放在一个临时表中,这样你只需要做一次:)
INSERT INTO requests_files_rel (column_for_count, column_for_requestid, column_for_fileid)
( SELECT COUNT(id_request), id_request, id_file
FROM requests_mandates_rel
WHERE id_file NOT IN (SELECT id_file FROM requests_files_rel)
);
UPDATE files_main fm,
( SELECT id_patient
FROM requests_main
WHERE id_request IN
( SELECT id_request
FROM requests_mandates_rel
WHERE id_file NOT IN (SELECT id_file FROM requests_files_rel)
)
) t
SET fm.id_patient = t.id_patient
WHERE fm.id_file IN (@id_file);
UPDATE files_main fm
SET fm.id_patient =
(
SELECT id_patient
FROM requests_main rm
INNER JOIN requests_mandates_rel rmr ON rm.id_request = rmr.id_request
WHERE fm.id_file = rmr.id_file
)
WHERE fm.id_file IN
(
SELECT id_file
FROM requests_mandates_rel
WHERE id_file NOT IN
(
SELECT id_file
FROM requests_files_rel
)
);
INSERT INTO requests_files_rel (id_request, id_file)
(
SELECT id_request, id_file
FROM requests_mandates_rel
WHERE id_file NOT IN
(
SELECT id_file
FROM requests_files_rel
)
);