mysql的limit存在BUG?

十月阳光 发布于 2013/05/27 16:23
阅读 2K+
收藏 0

使用mysql的查询语句:select * from picture limit 0,10;虽然看结果只有10条数据,但是把*换成count(*)就会发现,结果是所有记录的结果……

看这张图:


这到底是mysql的一个BUG,还是我做法有错误,求朋友给我讲一下。

加载中
0
傅小黑
傅小黑

count经过优化处理,limit关键字会有未知结果,

推荐用FOUND_ROWS()

十月阳光
十月阳光
好的,我试试。
0
z
zjwzcnjsy
http://stackoverflow.com/questions/802373/how-to-count-and-limit-record-in-a-single-query-in-mysql
0
红星xx
红星xx

你理解 错误 ,你的第二sql 就是统计 picture表 总共有多少条记录 ,它只返回 一个结果 ,一个记录总数。

你这样查 是想 干什么。

傅小黑
傅小黑
他是想比如总共有count = 100个结果,limit 10的count = 10,limit 20的count = 20,limit 95,10的count = 100-95 = 5
0
dedenj
dedenj
-。-你就不懂啥意思
十月阳光
十月阳光
我觉得我既然limit了,那我得到的结果应该是对应的记录数,而不是所有结果。
0
mark35
mark35
楼主你搞清楚 count(*) 是什么意思了么?
mark35
mark35
回复 @只是过路人 : 都limit 10了最多10条记录,怎么可能会是“所有”结果呢? 难不成这“所有”结果就不超过10条?
十月阳光
十月阳光
回复 @mark35 : 我在java代码中用select * from picture limit 0,10;查询,查询结果我想要的是10个对象,结果是该表的所有结果,应该怎样改进该语句?
mark35
mark35
回复 @只是过路人 : 这是最基本的SQL语法,如果这个都不清楚,建议你先了解下SQL的SELECT, UPDATE, INSERT, DELETE这几个最基本操作的语法
十月阳光
十月阳光
我学得潜,真心不能深刻理解每个概念。
0
南湖船老大
南湖船老大

你使用错误,你这种用法属于想当然.

你那种用法应该相当于:

SELECT * FROM (SELECT COUNT(*) FROM user) a LIMIT 0,10

或者参考如下代码:

@Override

    protected String buildPageSql(String sql, int from, int pageSize) {

        sql = removeSelect(sql);

        return "select SQL_CALC_FOUND_ROWS " + sql + " limit " + from + ", " + pageSize;

    }

    /** Returns FOUND_ROWS() sql to determine total count of founded rows.

    */

    @Override

    protected String buildCountSql(String sql) {

        return "SELECT FOUND_ROWS()";

    }

十月阳光
十月阳光
我在java代码中用select * from picture limit 0,10;查询,查询结果我想要的是10个对象,结果是该表的所有结果,应该怎样改进该语句?
0
戴威
戴威
select * from pciture order by id desc limit 10,1
戴威
戴威
回复 @只是过路人 : 我只是在告诉你MySQL的limit关键字用法。
十月阳光
十月阳光
这只能查一条结果?
0
暴走的蛇
暴走的蛇

这个结果并没有问题,例如你第一条sql,limit 0,10这是取的是10条记录.

但是你第二条sql是针对count之后的结果进行limit,很显然这条数据也是正确的啊,你按照sql执行逻辑是针对你count之后的结果进行limit操作,而并非对picture表的数据进行limit之后再count

十月阳光
十月阳光
我在java代码中用select * from picture limit 0,10;查询,查询结果我想要的是10个对象,结果是该表的所有结果。
0
sxgkwei
sxgkwei
。。。好奇葩
0
还没有名字
还没有名字

其实拉,就是优先级的问题

(select count(*) from picture) limit 0,10;

还没有名字
还没有名字
回复 @只是过路人 : 括号的意思是告诉你优先级 就像加减乘除的优先级一样,明白?
十月阳光
十月阳光
这样写,得到的还是表的所有结果,而不是10条结果。
返回顶部
顶部