选择每个第二行mysql而不使用auto_increment或table数据

时间:2013-03-22 19:48:53

标签: mysql

如何在MySQL中选择偶数编号的记录,而不使用任何列id或auto_increment?

我现在有这个ODD行:

SET @inc = 0;
SELECT * FROM
(SELECT *,@inc:=1-@inc autoinc
FROM mytable) A
WHERE autoinc = 1 ORDER BY id;

甚至:

SET @inc = 0;
SELECT * FROM
(SELECT *,@inc:=1-@inc autoinc
FROM mytable) A
WHERE autoinc = 1 ORDER BY id;

这很好用。但是在大桌子上它太慢了。 请建议我任何替代方案。

2 个答案:

答案 0 :(得分:4)

假设您正在使用足以支持子查询的MySQL版本 - 如果没有,您还在使用MySQL 3做什么? - 这是一个如何完成的例子,使用一个没有意义内容的临时表:

 mysql> create temporary table t (n text);
 Query OK, 0 rows affected (0.00 sec)

 mysql> insert into t (n) values ('a'), ('b'), ('c'), ('d'), ('e');
 Query OK, 5 rows affected (0.00 sec)
 Records: 5  Duplicates: 0  Warnings: 0

 mysql> select * from t;
 +------+
 | n    |
 +------+
 | a    | 
 | b    | 
 | c    | 
 | d    | 
 | e    | 
 +------+

 mysql> SET @i = 0; SELECT i, n FROM (SELECT @i := @i + 1 AS i, n FROM t) a WHERE MOD(a.i, 2) = 0;
 Query OK, 0 rows affected (0.00 sec)

 +------+------+
 | i    | n    |
 +------+------+
 |    2 | b    | 
 |    4 | d    | 
 +------+------+
 2 rows in set (0.00 sec)

 mysql> SET @i = 0; SELECT i, n FROM (SELECT @i := @i + 1 AS i, n FROM t) a WHERE MOD(a.i, 2) = 1;
 Query OK, 0 rows affected (0.00 sec)

 +------+------+
 | i    | n    |
 +------+------+
 |    1 | a    | 
 |    3 | c    | 
 |    5 | e    | 
 +------+------+
 2 rows in set (0.00 sec)

看看它是如何工作的?您将会话变量@i设置为零,然后在子查询中对其执行等效的预增量,以便为您提供索引列以及数据行。然后,在外部查询中,您根据@i mod 2是0(对于偶数行)还是1(对于奇数行)来选择行。

我选择了' i'外部查询中的列用于说明目的,但您不需要对该技术进行相同操作 - 或者,当然,如果您在外部查询中选择*,则可以忽略' i'结果中的列值。 (如果您的数据表中已经有一列,请在子查询中使用其他别名。)

该技术也很好地概括了;对于WHERE MOD(a.i,N)= 0,你每回到第N行。

答案 1 :(得分:3)

也许你可以通过MOD

寻找类似的东西

试试这个

    select * from Table1 where mod(id, 2) <> '1' 

DEMO HERE

如果要输出奇数行1,3,5,... 然后使用这个

       select * from Table1 where mod(id, 2) <> '0'