【问题标题】:Retrieving distinct rows where columns have the same value and iterating by not having a cursor timeout?检索列具有相同值的不同行并通过没有游标超时进行迭代?
【发布时间】:2016-05-18 07:27:28
【问题描述】:

我见过thisthisthis,但没有一个答案能解决我的问题。由于sql_mode=only_full_group_by 错误,即使group by 也无法正常工作。

我有一个包含行的表格:
id、cId、aId、eId、val
1 231 6 56 4
2 231 6 56 7
3 451 6 30 4
4 762 7 56 4
5 342 7 32 5
6 453 7 34 6
7 342 7 32 8

我只想要基于 cIdaIdeId 的不同行。所以结果将是:
231 6 56
451 6 30
762 7 56
342 7 32
453 7 34

两大挑战:
1. 什么查询可以给我这个结果?
2. 数据库包含大约 1600 万行。一旦我检索到唯一的行,我将通过ResultSetJava 对其进行迭代。我遇到了MongoDB 的问题,当迭代一个很长的结果集时,即使我正在积极迭代,游标与数据库的连接也会超时。我被告知如果MySQL 是一个非常大的结果集,也会发生同样的情况。

所以我的问题不仅在于检索那些不同的行,还在于以一种能够一次迭代可能 10000 个块的方式获取它.我知道limit 命令,但我不知道如何在运行限制为 10000 的选择后继续从第 10001 个结果中检索。

【问题讨论】:

    标签: java mysql


    【解决方案1】:

    怎么样

    select distinct cId,aId, eId from TheTable;
    

    另见关于 sql 分页(如有必要)。

    您会在 Java 中使用重复命令的页面中获得结果,如下所示:

    select distinct cId, aId, eId from TheTable limit 1, 10000;
    select distinct cId, aId, eId from TheTable limit 10001, 10000;
    select distinct cId, aId, eId from TheTable limit 20001, 10000;
    select distinct cId, aId, eId from TheTable limit 30001, 10000;
    

    等等……
    您需要一个变量来将 1 更改为 10001,然后更改为 20001 等。这些语句的含义是从 ​​TheTable 中选择一些内容并将其限制为结果的第一行到结果的第 10000 行.第二个选择从不同结果的第 10001 行到第 10001+10000 行进行选择。

    但在开始分页之前,了解您要迭代的结果总数会有所帮助。你可以这样做:

    select count(distinct cId,aId, eId) from TheTable;
    

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 2017-01-31
      • 2019-07-10
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多