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 有很多行时,counting 可能会很慢。

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]

mysql 的delete from 和update子查询限制

带内连接和限制的mysql子查询

MySQL的查询,子查询,联结查询,联合查询

MySQL的SQL语句 - 数据操作语句(13)- 子查询(13)

mysql的查询子查询及连接查询