首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环选择查询结果集元素并获取MySQL中的元素

问循环选择查询结果集元素并获取MySQL中的元素
EN

Stack Overflow用户
提问于 2014-01-21 14:25:32
回答 3查看 14.6K关注 0票数 1

我正在使用MySQL 5.2.42 CE。

我有一个表,其中有一个名为"organization_id"的列。它包含不同行的一些重复值,这意味着该字段中可以有多行的"org1"值。现在我必须遍历该列的不同值,这意味着不同的组织。

但是我不知道有没有For-Each loop in mysql。

我就是这样做的:

代码语言:javascript
复制
Select Distinct organization_id From tbl_organization

这给我返回了所有不同的组织。现在,我如何遍历列表并访问每个organization_id?我在DB的触发器中写下了这段代码。请帮帮忙。

谢谢和问候,Surodip Patra

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-21 14:32:48

您必须使用CURSORS。使用游标将获取的id读取到局部变量中,并基于该组织id执行其他条件操作。

代码语言:javascript
复制
...
DECLARE cur_orgs CURSOR FOR
           SELECT DISTINCT organization_id FROM tbl_organization;  
...

OPEN cur_orgs;
...

Reading_Orgs: LOOP
    FETCH cur_orgs INTO _org_id;
    ... 
    IF done THEN
      LEAVE Reading_Orgs;
    END IF;

    IF ... THEN
      ...
    ELSE
      ...
    END IF;
END LOOP;

CLOSE cur_orgs;

...
...
票数 3
EN

Stack Overflow用户

发布于 2014-01-21 14:31:43

如果我没弄错的话

您可以在触发器中使用CURSOR。

ursor用于迭代查询返回的一组行,并处理单个行。目前,对于高于5.x的所有版本,MySQL游标具有以下属性:

update cursor.

  • Non-scrollable: Read only:这意味着您不能更新只能在一个方向上遍历的表,并且不能在结果表中跳过、前后移动。在打开表上的游标时,应避免使用
  • ,否则可能会得到意外的结果。

MySQL支持以下使用游标的语句。

首先,您必须使用declare语句声明游标:

代码语言:javascript
复制
DECLARE cursor_name CURSOR FOR SELECT_statement;

其次,您必须使用OPEN语句打开游标。在从游标中提取行之前,必须先打开游标。

代码语言:javascript
复制
 OPEN cursor_name;

接下来,您可以使用FETCH语句从游标中检索下一行,并将游标移动到结果集中的下一行。

代码语言:javascript
复制
FETCH cursor_name INTO variable list;

最后,您必须关闭光标以停用它,并释放与该光标关联的内存。要关闭游标,可以使用close语句:

代码语言:javascript
复制
CLOSE cursor_name;

并使用循环在mysql变量中获取列的值。

你可以查看更多的细节和一个很好的教程,关于如何使用光标。http://www.mysqltutorial.org/mysql-cursor/

票数 1
EN

Stack Overflow用户

发布于 2014-01-23 03:22:20

在大家给出的答案的帮助下,我完成了我的任务。我的SQL如下所示:

代码语言:javascript
复制
CREATE DEFINER=`root`@`%` PROCEDURE `test_report`()
BEGIN

DECLARE _id varchar(20);
DECLARE done int;
    DECLARE cur_report cursor for
                    Select distinct id From my_report_table;
       DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
       SET @start_date = DATE_FORMAT(CURDATE(), '%Y-%m-01'); # first date of month
       SET @end_date = LAST_DAY(CURDATE()); #last date of month
        open cur_report;
        reading_reports: LOOP
            Fetch cur_report INTO _id; 
                IF done = 1 THEN
                    LEAVE reading_orgs;
                END IF;
                Insert into my_table(id,creation_date,start_date,end_date) Values(_id,CURDATE(),@start_date,@end_date);
        END LOOP;
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21250731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档