MySQL - 限制子查询

时间:2014-04-09 06:52:56

标签: mysql

我想限制除第1行以外的所有选择 Id是int,但不是UNIQUE,
checkIn是日期

SELECT * FROM table  
Order by property_id, checkIn DESC 
LIMIT 2, (SELECT Count(property_id)-1 FROM table)

两个查询都正常运行。但后来我把它们放在一起我得到了

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(SELECT Count(property_id) FROM table)' at line 1

也许这里是LIMIT 1, ALL所有行的通用密钥?

5 个答案:

答案 0 :(得分:1)

如果您需要除第一行以外的所有行,请尝试以下操作:

SELECT * FROM TBL LIMIT 1, 18446744073709551615;

18446744073709551615建议使用mysql docs中的值和无符号bigint的最大值。

There was a similar question

答案 1 :(得分:1)

为了完整起见,您可以通过准备好的声明来实现这一目标:

SET @skip=1; 
SET @numrows=(SELECT Count(property_id)-1 FROM table);
PREPARE STMT FROM 'SELECT * FROM table Order by property_id, checkIn DESC LIMIT ?, ?';
EXECUTE STMT USING @skip, @numrows;

虽然,如果它是InnoDB表,我不建议重复执行SELECT COUNT(*)。与MyISAM不同,它不会在表中存储行数。因此,当InnoDB有很多行时,count可能会很慢。

P.S。:请注意,当您想要跳过一行时,必须使用limit 1, how_many而不是limit 2, how_many,因为它从0开始计数,而不是从1开始计数。

答案 2 :(得分:0)

Johan 已经提到了here

  

您不能将子查询用作LIMIT参数。限制论点   应该是INTEGER。你的子查询返回,基本上,...   表

From the MySQL manual

  

LIMIT子句可用于约束SELECT语句返回的行数。 LIMIT需要一个或两个数字参数,它们必须都是非负整数常量,但有以下例外:

     

在预准备语句中,可以使用?指定LIMIT参数?占位符标记。

     

在存储的程序中,LIMIT参数可以使用整数值例程参数或MySQL 5.5.6中的局部变量来指定。

修改

试试这个

但我没有经过测试

DECLARE offset bigint;
SELECT Count(property_id)-1 INTO offset FROM table;
SELECT * FROM table Order by property_id, checkIn DESC LIMIT 2,offset;

答案 3 :(得分:0)

我同意@omeinusch's answer,但也提供以下替代方案:

SELECT * FROM table t JOIN (
  SELECT   property_id, checkIn
  FROM     table
  ORDER BY property_id, checkIn DESC
  LIMIT    2,1
) s ON (t.property_id > s.property_id)
    OR (t.property_id = s.property_id AND t.checkIn <= s.checkIn)

答案 4 :(得分:0)

如果您有唯一的ID列,那么您可以这样做:

select * FROM table 
where id <> (SELECT id FROM table Order by property_id, checkIn DESC LIMIT 1)

否则,假设property_id和checkIn是唯一的,

select * FROM table 
where concat(property_id,'|',checkIn) <> 
     (SELECT concat(property_id,'|',checkIn)  FROM table Order by property_id, checkIn DESC LIMIT 1)