【问题标题】:Mysql variables and loopsMysql 变量和循环
【发布时间】:2014-11-09 03:26:45
【问题描述】:

我写mysql查询。我需要获取 2 个表之间的差异,在第 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);

永远不要使用这些查询。也许有人可以告诉我解决我的问题的方法。谢谢。

【问题讨论】:

    标签: mysql loops variables


    【解决方案1】:

    尝试像这样更改顺序

    SELECT COUNT(id_request) INTO @cnt
    

    注意:您只能在变量中存储一个值。所以在你的问题中你说你只更新了最后一个值..这可能是因为你有一个 AGGREGATE COUNT() 它将所有行合并为一个..除非你使用 group by ...你的变量不会处理多行数据...

    如果您想在此操作中使用变量,那么您需要进行一些更改..

    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
    

    现在要使用连接值,您必须使用 FIND_IN_SET()

    UPDATE files_main fm, 
        (   SELECT id_patient
            FROM requests_main
            WHERE FIND_IN_SET(id_request, @id_req) > 0
        ) t
        SET fm.id_patient = t.id_patient
        WHERE fm.id_file IN (@id_file);
    

    我很好奇您是否应该首先使用变量...您不能像这样进行查询吗?

    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 变量中,它只包含一个标量值...所以您必须使用 group_concat 将行组合成一个...然后使用 find_in_set() 将它们从逗号分隔列表中拉出。
    • 稍后会尝试一些,非常大的数据库需要时间来获取它。也谢谢。
    • 我更改查询并遇到另一个问题。当我尝试使用条件 WHERE IN (@id_file) 时,mysql 仅从连接值中获取第一个值,如果我手动输入该值,查询效果很好。
    • @kickman2l 你可以再次选择它们.. 我只是想减少开销.. 只需将@id_file 更改为那些特定文件的选择。或者甚至更好地把它放在一个临时表中,这样你只需要做一次:)
    【解决方案2】:
    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
           )
    );
    

    这是我的最终变体,一切正常,感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 2012-05-17
      • 2015-04-30
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      相关资源
      最近更新 更多