如何在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;
这很好用。但是在大桌子上它太慢了。 请建议我任何替代方案。
答案 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'
如果要输出奇数行1,3,5,...
然后使用这个
select * from Table1 where mod(id, 2) <> '0'