2016-12-01 100 views
1

我有一个像隐藏ROW_NUMBER()的子查询

Select * 
From y 
WHERE y.z = (
SELECT a, (adding rownumber here) 
FROM b 
) 

查询我想增加一个条款,它仅选择每隔一行。要做到这一点,我需要添加row_number()子查询,并有一个条款,其中rownumber%2 = 0.

我的问题是,我可以添加rownumber到子查询的选择,并以某种方式隐藏它它不影响查询

+1

MySQL缺少内置的'ROWNUM'功能。 –

+1

您可以将子查询嵌套在仅选择所需字段的另一个查询中;为了只获得“每隔一行”,您可能需要(我在MySQL中创建“行号”的最常见方式涉及会话变量,这些变量在查询中的不同子句中使用时无法预测地工作)。 – Uueerdo

回答

1

在MySQL中的Rownumbering是一个臭名昭着的痛苦的脖子。

你可以像这样在MySQL中为你的行编号。

  SELECT (@rownum := @rownum+1) rownum, b.* 
      FROM b 
      JOIN (SELECT @rownum := 0) init 
      ORDER BY b.whatever 

不要忘记这里的ORDER BY子句。如果没有明确的排序,查询引擎可以自由地随机化它返回的行的顺序。

然后,您可以使用该混乱作为子查询,并与rownum做事情。

SELECT * 
    FROM (
       SELECT (@rownum := @rownum+1) rownum, b.* 
       FROM b 
       JOIN (SELECT @rownum := 0) init 
       ORDER BY b.whatever 
     ) table_with_rownum 
    WHERE rownum % 2 = 0 

如果你不想显示rownumbers,改变你的SELECTSELECT *SELECT col, col, col并离开了rownum