Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql变量和循环_Mysql_Loops_Variables - Fatal编程技术网

Mysql变量和循环

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

我编写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 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
       )
);