【问题标题】:Iterate result set like array像数组一样迭代结果集
【发布时间】:2014-10-25 23:24:38
【问题描述】:

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

array[index]

或者:

collection.getElementByIndex(index)

更新:

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

【问题讨论】:

  • 索引在表中没有真正意义,所以问题是为什么你想要这样做?你想完成什么?
  • @MatsKindahl 我添加了更多信息。 检查更新
  • 然后您可以编写一个查询,返回所有符合条件的行。你要第一排还是第二排?如果日期之间恰好 90 天,或日期之间小于 90 天,或超过 90 天,您是否想要该行日期之间。
  • @MatsKindahl 结果应该给我 boolean 答案在所有日期之间是 90 天或更长时间?
  • 查看下面的答案,它包含两种不同的方法来解决您的问题。

标签: mysql sql arrays loops join


【解决方案1】:

你有两种选择:

  1. 使用子选择。
  2. 使用 MySQL 迭代返回的行的能力。

第一个替代方案如下:

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 |
+------------+

第二个可能更快,但我没有在更大的集合上进行测量。

【讨论】:

  • 一切正常。但是当我有两个相同的日期2014-05-11, 2014-05-11 时,结果是1 应该是0
  • 哪一个?当我在表中使用两个相同的日期尝试时,最后一个返回 0。
  • 这是我完整的 query,当我有重复的日期时,它应该返回 12(UserId) NULL
  • 更新了答案以包括您有重复条目的情况。请检查它是否解决了您的问题。
  • 还是有问题。当我只有两个日期 2014-05-11, 2014-05-11 时,结果应该是 0 当我遵循设置 2014-02-10 2014-05-11, 2014-05-11 2014-10-23 时,结果应该是 1。作为替代需要使用DISTINCT 日期集。
【解决方案2】:

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

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

select * from Table where RowNum = %index%;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2021-09-29
    • 1970-01-01
    • 2016-01-17
    • 2010-09-05
    相关资源
    最近更新 更多