在MySQL中循环结果集?mysql-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

在MySQL中循环结果集?mysql

保持可爱mmm 2020-05-17 13:34:01 86

我正在尝试在MySQL中编写一个存储过程,该存储过程将执行一个稍微简单的选择查询,然后循环遍历结果,以便决定是执行其他查询,数据转换还是完全丢弃数据。有效地,我想实现这一点:

$result = mysql_query("SELECT something FROM somewhere WHERE some stuff"); while ($row = mysql_fetch_assoc($result)) { // check values of certain fields, decide to perform more queries, or not // tack it all into the returning result set } 只有,我只希望在MySQL中使用它,因此可以将其称为过程。我知道对于触发器来说,有FOR EACH ROW ...语法,但是找不到在CREATE TRIGGER ...语法之外使用的类似内容。我已经阅读了MySQL中的一些循环机制,但到目前为止,我所能想象的就是我将实现以下内容:

SET @S = 1; LOOP SELECT * FROM somewhere WHERE some_conditions LIMIT @S, 1 -- IF NO RESULTS THEN LEAVE -- DO SOMETHING SET @S = @S + 1; END LOOP 尽管这在我心中还是有些朦胧的。

作为参考,尽管我认为这不一定必要,但初始查询将把四个表连接在一起,形成一个层次权限模型,然后根据特定权限在链的最高位置,将检索有关应该继承该权限的子级。

存储 关系型数据库 MySQL
分享到
取消 提交回答
全部回答(1)
  • 保持可爱mmm
    2020-05-17 13:43:57

    这样的事情应该可以解决问题(但是,请在摘要后阅读以获取更多信息)

    CREATE PROCEDURE GetFilteredData() BEGIN DECLARE bDone INT;

    DECLARE var1 CHAR(16); -- or approriate type DECLARE Var2 INT; DECLARE Var3 VARCHAR(50);

    DECLARE curs CURSOR FOR SELECT something FROM somewhere WHERE some stuff; DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;

    DROP TEMPORARY TABLE IF EXISTS tblResults; CREATE TEMPORARY TABLE IF NOT EXISTS tblResults ( --Fld1 type, --Fld2 type, --... );

    OPEN curs;

    SET bDone = 0; REPEAT FETCH curs INTO var1,, b;

    IF whatever_filtering_desired
       -- here for whatever_transformation_may_be_desired
       INSERT INTO tblResults VALUES (var1, var2, var3 ...);
    END IF;
    

    UNTIL bDone END REPEAT;

    CLOSE curs; SELECT * FROM tblResults; END 需要考虑的几件事...

    关于以上代码段:

    可能希望将查询的一部分传递给存储过程,尤其是搜索条件,以使其更加通用。 如果要由多个会话等调用此方法,则可能希望传递一个会话ID来创建唯一的临时表名(实际上是不必要的考虑,因为不同的会话不共享相同的临时文件名称空间;请参阅下面Gruber的评论) ) 需要正确指定一些部分,例如变量声明,SELECT查询等。 更一般而言:尝试避免需要游标。

    我特意将游标变量命名为curs [e],因为游标是一种混杂的祝福。它们可以帮助我们实施复杂的业务规则,而这些业务规则可能很难以SQL的声明形式来表达,但是它带给我们使用SQL的过程式(命令式)形式,这是SQL的一般功能,既不是非常友好/表现力,编程方面以及效率通常较低的方面。

    也许您可以研究在“普通”(说明性)SQL查询的上下文中表达所需的转换和过滤。来源:stack overflow

    0 0
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

推荐文章
相似问题