MySQL - 限制子查询
Posted
技术标签:
【中文标题】MySQL - 限制子查询【英文标题】:MySQL - Limit with sub query 【发布时间】:2014-04-09 06:52:56 【问题描述】:我想限制选择除第一行以外的所有内容。Id 是 int,但不是 UNIQUE, 签入日期
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
处所有行的通用键?
【问题讨论】:
【参考方案1】:如果您需要除第一行之外的所有行,请尝试以下操作:
SELECT * FROM TBL LIMIT 1, 18446744073709551615;
18446744073709551615
是 mysql docs 中的推荐值和无符号 bigint 的最大值。
There was a similar question.
【讨论】:
【参考方案2】:为了完整起见,以下是使用准备好的语句的方法:
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
ing 可能会很慢。
P.S.:请注意,当您想跳过一行时,您必须使用 limit 1, how_many
而不是 limit 2, how_many
,因为它从 0 开始计数,而不是从 1 开始。
【讨论】:
【参考方案3】:约翰已经提到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;
【讨论】:
那么这里没有办法实现吗?我的意思是显示除第一个以外的所有项目,如果行数一直在变化?编辑:我的意思是在一个查询中只使用 MySQL。 它在 DECLARE'ing 偏移的开始时给我语法错误 @Laimonas 你现在可以检查一下吗 我一开始出错后尝试过。有点同样的错误#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 'DECLARE offset bigint' at line 1
@Laimonas 如果您只需要所有但不是第一行,则不应在值之前计算。我的解决方案性能更高。【参考方案4】:
我同意@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)
【讨论】:
我收到#1054 - Unknown column 't.property_id' in 'on clause'
哦,我需要将第一行更改为SELECT * FROM table AS t JOIN (
如果我做对了,它会显示 ID 大于第一个的项目,但是,在我的情况下,问题 ID 不是唯一的
@Laimonas:这种解释省略了最后一行,OR ...
。【参考方案5】:
如果你有一个唯一的 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)
【讨论】:
Id 在这种情况下不是唯一的,所以它不会那样工作。以上是关于MySQL - 限制子查询的主要内容,如果未能解决你的问题,请参考以下文章
mysql 的delete from 和update子查询限制