在MySQL中选择每隔一行而不依赖于任何ID?

7
考虑下面这张没有主键的表格,我能选择除每一行之外的其余行吗?
col1      col2
 2         a
 1         b
 3         c
 12        g

第一个选择必须找到:2、3

第二个选择必须找到:1、12

有可能吗?


1
请参考以下相关答案:https://dev59.com/PXA75IYBdhLWcg3w_ef1 - hbhakhra
5个回答

8
以 MySQL 独特的方式:
select  *
from    (
        select  *
        ,       @rn := @rn + 1 as rn
        from    Table1
        join    (select @rn := 0) i
        ) s
where   rn mod 2 = 0 -- Use = 1 for the other set

Example at SQL Fiddle.


2

这对我来说可行。

    SET @row_number = 0;

    select* from (
        SELECT 
        (@row_number:=@row_number + 1) AS num, col1,col2
    FROM
        TABLE1
        ) as t WHERE num%2=0

您可以对奇数行使用模1,对偶数行使用模0


2
可以使用临时变量。
示例:
set @a := 0;
select * from car_m_city  WHERE mod((@a:=@a+1), 2) = 1

解释:

在 SQL 中,我们声明了一个临时变量 @a (set @a := 0;)。现在,@a 每次增加 1,就像简单的检查奇偶性一样。

mod((@a:=@a+1), 2) = 1 表示数据为奇数

mod((@a:=@a+1), 2) = 0 表示数据为偶数


2

试试这个。我从下面链接的答案中改编而来。 我在 SQLFiddle 上测试过了,看起来能正常工作。

http://sqlfiddle.com/#!2/0bccf/28
http://sqlfiddle.com/#!2/0bccf/29

奇数行:

SELECT x.*
FROM (
     SELECT @rownum:=@rownum+1 rownum, t.*
     FROM (SELECT @rownum:=0) r, table t
) x
WHERE MOD(x.rownum, 2) = 1

偶数行:

SELECT x.*
FROM (
     SELECT @rownum:=@rownum+1 rownum, t.*
     FROM (SELECT @rownum:=0) r, table t
) x
WHERE MOD(x.rownum, 2) = 0

来源: MySQL行号


1

这应该适用于MySQL:

SELECT col1, col2
FROM (
   SELECT col1, col2, @rowNumber:=@rowNumber+ 1 rn
   FROM YourTable
      JOIN (SELECT @rowNumber:= 0) r
) t 
WHERE rn % 2 = 1

这里使用的是MOD运算符,表示取模。以下是示例代码:http://sqlfiddle.com/#!2/cd31b/2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接