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 中指定限制和偏移量不起作用