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

时间:2014-01-21 06:25:32

标签: mysql sql

我正在使用MySQL 5.2.42 CE

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

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

我这样做了:

Select Distinct organization_id From tbl_organization

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

谢谢&问候, Surodip Patra

3 个答案:

答案 0 :(得分:3)

您必须使用CURSORS。 使用游标,将获取的id读入局部变量,并根据组织ID执行其他条件操作。

...
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;

...
...

答案 1 :(得分:1)

如果我理解正确的话

您可以在触发器中使用 CURSOR

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

  • 只读:表示您无法更新光标。
  • 不可滚动:它只能在一个方向上移动而不能跳过,在结果集中来回移动。
  • 敏感:在该表上打开光标时应避免更新表,否则可能会出现意外结果。

MySQL支持以下用于处理游标的语句。

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

DECLARE cursor_name CURSOR FOR SELECT_statement;

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

 OPEN cursor_name;

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

FETCH cursor_name INTO variable list;

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

CLOSE cursor_name;

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

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

答案 2 :(得分:0)

我在所有人给出的答案的帮助下完成了我的任务。 我的SQL如下:

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