我想限制除第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
所有行的通用密钥?
答案 0 :(得分:1)
如果您需要除第一行以外的所有行,请尝试以下操作:
SELECT * FROM TBL LIMIT 1, 18446744073709551615;
18446744073709551615
建议使用mysql docs中的值和无符号bigint的最大值。
答案 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
。你的子查询返回,基本上,... 表
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)