MySql 限制和偏移量给出错误的结果

Posted

技术标签:

【中文标题】MySql 限制和偏移量给出错误的结果【英文标题】:MySql limit and offset giving wrong result 【发布时间】:2017-03-17 21:13:02 【问题描述】:

在 9900 偏移后,我只获得了 99 条限制 100 的记录。即使我在 db 中有 2,00,000 条记录,并且在两个具有不同的表中都有左连接。我的查询或循环有什么问题

即使我在 phpmyadmin 中尝试了查询,它也给出了相同的结果 99 条记录。

查询

select distinct(table1.id), table2.name, table2.uuid from table1
        left join table2 on table1.id = table2.id limit 9900, 100

Laravel 查询:

$this
->database
->table('table1')
->selectRaw('distinct(table1.id), table2.uuid, table2.name')
->leftJoin('table1.id', '=', 'table2.id')
->where('opponent_uID', '>', $uID)
->skip($offset)
->take($limit)
->get();

循环

$limit = 100;
$offset = 0;
while (true) 
     $result = $this->query($limit, $offset);
     $offset += $limit;
     if (empty($result)) 
         break;
     
     // Logic here

【问题讨论】:

告诉我们你的数据库中有多少条记录有点没有意义。更相关的是被连接的两个表中的记录数,以及左连接如何增加结果集中可能的记录数。此外,使用DISTINCT 会影响记录数。 @TimBiegeleisen 2,00,000 条左连接表中的记录 【参考方案1】:

这可能不是解决它提供 99 条记录的原因的正确答案。但是当我使用该查询时,我找到了这些解决方案

问题:

    查询的一个主要问题是我没有订购依据。

mysql MyISAM 表不保证结果没有 out order by on 限制,偏移量

解决方案:

    在查询中使用 order by 给出 100 个结果但未对整个循环进行测试

    select distinct(table1.id), table2.name, table2.uuid from table1 left join table2 on table1.id = table2.id order by table1.id limit 9900, 100

    奇怪的是,如果我使用 table2.* 而不是同一查询中的某些字段,而 out order by 会给出 100 条记录

    select distinct(table1.id), table2.* from table1 left join table2 on table1.id = table2.id order by table1.id limit 9900, 100

所以,最后我对这个问题的假设是左连接表中的空值可能会给出错误的结果。

【讨论】:

以上是关于MySql 限制和偏移量给出错误的结果的主要内容,如果未能解决你的问题,请参考以下文章

在 Django QuerySet 中指定限制和偏移量不起作用

Laravel Eloquent 限制和偏移量

MySQL 偏移无限行

如何在 mongodb 中使用偏移量和限制?

limit where group by having select

使用以百分比给出的 imagemagick 偏移量裁剪图像