迭代结果集,如数组

时间:2014-09-01 17:46:25

标签: mysql sql arrays loops join

我如何在MySQL 从结果集中按索引获取任何行,因为在大多数编程语言中使用数组或集合

array[index]

或者:

collection.getElementByIndex(index)

更新

我有一个结果日期,我需要检查每个日期之间是否有90天

2 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. 使用子选择。
  2. 使用MySQL的能力迭代返回的行。
  3. 第一种选择如下:

    SELECT BIT_AND(IFNULL(DATEDIFF((SELECT dt FROM foo WHERE dt > a.dt ORDER BY dt LIMIT 1), a.dt) >= 90, 1)) AS all_larger
      FROM foo a;
    

    更新:要处理重复日期的表格,必须添加第二个子选项以查看日期是否重复,如下所示:

    SELECT BIT_AND(larger && ! duplicates) AS all_larger
      FROM (SELECT a.dt
                 , IFNULL(DATEDIFF((SELECT dt FROM foo WHERE dt > a.dt ORDER BY dt LIMIT 1), a.dt) >= 90, 1) AS larger
                 , (SELECT COUNT(*) FROM foo WHERE dt = a.dt) > 1 AS duplicates
              FROM foo a) AS x;
    

    第二种选择如下:

    SET @prev = NULL;
    SELECT BIT_AND(a.larger) AS all_larger
      FROM (SELECT IFNULL(DATEDIFF(dt, @prev) >= 90, 1) AS larger
                 , @prev := dt
              FROM foo ORDER BY dt) a;
    

    在日期差异超过90天的表格上运行时,两者都给出以下结果集:

    +------------+
    | all_larger |
    +------------+
    |          1 |
    +------------+
    

    第二个可能更快,但我还没有在较大的套装上进行测量。

答案 1 :(得分:0)

本质上你不能。关系数据库不保留记录顺序(或者至少你不能依赖它,即使它暂时存储记录顺序)。通过这种方式,它更像是一个hashmap或List而不是一个数组。

但是,如果您愿意,可以在表格中添加一个字段 - 让我们称之为RowNum - 存储行号,您可以查询该字段。

select * from Table where RowNum = %index%;