mysql order by LIMIT 后 行号错乱问题

MySql 码拜 8年前 (2016-02-01) 1175次浏览
— 描述:用@rowindex:=@rowindex+1获取查询出数据的行号,order by 之后@rowindex完全乱了,不order by 是正常的.
— 0表结构与测试数据
— DROP TABLE IF EXISTS table_a;
CREATE TABLE table_a (
id INT(11) NOT NULL AUTO_INCREMENT,
a_name VARCHAR(20) DEFAULT NULL,
create_time DATETIME DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB  DEFAULT CHARSET=utf8;
INSERT  INTO table_a(id,a_name,create_time) VALUES (1,””a””,””2015-12-03 00:00:00″”),(2,””b””,””2015-12-04 00:00:00″”),(3,””c””,””2015-12-05 00:00:00″”);
— DROP TABLE IF EXISTS table_b;
CREATE TABLE table_b (
id INT(11) NOT NULL AUTO_INCREMENT,
a_id INT(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB  DEFAULT CHARSET=utf8;
INSERT  INTO table_b(id,a_id) VALUES (1,1),(2,1),(3,2);
— DROP TABLE IF EXISTS table_c;
CREATE TABLE table_c (
id INT(11) NOT NULL AUTO_INCREMENT,
a_id INT(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB  DEFAULT CHARSET=utf8;
INSERT  INTO table_c(id,a_id) VALUES (1,1),(2,1),(3,2);
— 1测试语句1
SET @rowindex=0;
SELECT SQL_CALC_FOUND_ROWS @rowindex:=@rowindex+1 AS rownumber, a.id, b.id,c.id ,a.create_time
FROM  table_a a
JOIN table_b b ON a.id=b.a_id
JOIN table_c c ON a.id=c.a_id
LIMIT 0,10;
— 2测试语句2
SET @rowindex=0;
SELECT SQL_CALC_FOUND_ROWS @rowindex:=@rowindex+1 AS rownumber, a.id, b.id,c.id ,a.create_time
FROM  table_a a
JOIN table_b b ON a.id=b.a_id
JOIN table_c c ON a.id=c.a_id
ORDER BY a.create_time DESC
LIMIT 0,10;
— 3问题
— 为什么测试语句2 本人要的行号@rowindex的顺序是乱的
— 怎么写才能写出ORDER BY 字段 DESC 之后的正确行号
解决方案:15分
ORDER BY 是将得到的数据在排序,
@rowindex是在执行时就赋值了
想要不乱:
select c.*,@rowindex:=@rowindex+1 AS rownumber
(SELECT SQL_CALC_FOUND_ROWS, a.id, b.id,c.id ,a.create_time
FROM  table_a a
JOIN table_b b ON a.id=b.a_id
JOIN table_c c ON a.id=c.a_id
ORDER BY a.create_time DESC
LIMIT 0,10
)c;
解决方案:15分
建议直接使用 select count(*) from tb ,假如你的表有索引的话,速度会更快。
解决方案:15分
解决方案:25分
在另一贴有回复

SELECT 
SQL_CALC_FOUND_ROWS @rowindex:=@rowindex+1 AS rownumber,T.*
FROM 
(SELECT
 a.id AS id1, b.id AS id2,c.id AS id3,a.create_time 
FROM  table_a a 
JOIN table_b b ON a.id=b.a_id
JOIN table_c c ON a.id=c.a_id 
ORDER BY a.create_time DESC
LIMIT 0,10
) AS T
CROSS JOIN (SELECT @rowindex:=0) rownumber
;
解决方案:15分
在多表联合查询的时候,有时使用SQL_CALC_FOUND_ROWS会快一倍
解决方案:15分
你的意思是mysql只计算一次,就能得出记录条数,以及实际的记录数了对吗?
但是本人觉得count(*)这种计算也不会消耗很多时间,本质上就是一个索引扫描,速度可以很快。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mysql order by LIMIT 后 行号错乱问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)