Mysql sql in运算符,具有每个元素的限制和偏移量

Mysql sql in运算符,具有每个元素的限制和偏移量,mysql,sql,subquery,limit,offset,Mysql,Sql,Subquery,Limit,Offset,目前我使用多个查询来获得如下数据: SELECT value1, value2 FROM table WHERE id=10 ORDER BY date DESC LIMIT 1 OFFSET 1 SELECT value1, value2 FROM table WHERE id IN (10,12) ORDER BY date DESC LIMIT 2 OFFSET 1 现在,我想要一个这样的唯一查询: SELECT value1, value2 FROM table WHERE id=1

目前我使用多个查询来获得如下数据:

SELECT value1, value2 FROM table WHERE id=10 ORDER BY date DESC LIMIT 1 OFFSET 1
SELECT value1, value2 FROM table WHERE id IN (10,12) ORDER BY date DESC LIMIT 2 OFFSET 1
现在,我想要一个这样的唯一查询:

SELECT value1, value2 FROM table WHERE id=10 ORDER BY date DESC LIMIT 1 OFFSET 1
SELECT value1, value2 FROM table WHERE id IN (10,12) ORDER BY date DESC LIMIT 2 OFFSET 1
但是很明显,由于offset参数,它无法正常工作,所以我无法得到任何正常工作的东西,我想我可以使用一些子查询,但是
Mysql
的版本是
5.1.x
,它不允许子查询中的限制或偏移

样本数据:

id value1 value2 date
1   64.2   10.1  2017-01-06 10:20:00
2   20.2   2.5   2017-01-06 10:19:30
2   20.3   2.4   2017-01-06 10:19:10
1   63.8   10.0  2017-01-06 10:19:00
3   20.0   9.9   2017-01-06 10:18:30
2   20.1   2.4   2017-01-06 10:18:00
3   19.9   5.0   2017-01-06 10:17:59
例如,我希望(对于每个ID,我希望有倒数第二个数据):


甚至有可能吗?

据我所知,您希望将限制和偏移量独立应用于查询的两个不同子集。在大多数RDBMS中,您可能会有某种子查询来实现这一点。在其他关系数据库系统中用于执行此操作的主要特性是窗口函数和公共表表达式。MySQL还不支持这些

好的,这里的主要问题是MySQL不支持窗口函数或公共表表达式。如果支持这些功能中的任何一个,就不会有问题

绕过这一限制将是一件难事。没有一个很好的,优雅的方法来做这件事。但是,您可以通过以下两种方法之一解决此问题


第一种方法是使用一个临时表来构建结果,第二种方法是通过创建视图来模拟常用表表达式。

据我所知,您希望将限制和偏移量独立应用于查询的两个不同子集。在大多数RDBMS中,您可能会有某种子查询来实现这一点。在其他关系数据库系统中用于执行此操作的主要特性是窗口函数和公共表表达式。MySQL还不支持这些

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
( id INT NOT NULL
, value1 DECIMAL(5,2) NOT NULL
, value2 DECIMAL(5,2) NOT NULL
, date DATETIME NOT NULL
, PRIMARY KEY(id,date)
);

INSERT INTO my_table VALUES
(1   ,64.2   ,10.1  ,'2017-01-06 10:20:00'),
(2   ,20.2   ,2.5   ,'2017-01-06 10:19:30'),
(2   ,20.3   ,2.4   ,'2017-01-06 10:19:10'),
(1   ,63.8   ,10.0  ,'2017-01-06 10:19:00'),
(3   ,20.0   ,9.9   ,'2017-01-06 10:18:30'),
(2   ,20.1   ,2.4   ,'2017-01-06 10:18:00'),
(3   ,19.9   ,5.0   ,'2017-01-06 10:17:59');
好的,这里的主要问题是MySQL不支持窗口函数或公共表表达式。如果支持这些功能中的任何一个,就不会有问题

绕过这一限制将是一件难事。没有一个很好的,优雅的方法来做这件事。但是,您可以通过以下两种方法之一解决此问题

第一种方法是使用临时表来构建结果,第二种方法是通过创建视图来模拟公共表表达式

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
( id INT NOT NULL
, value1 DECIMAL(5,2) NOT NULL
, value2 DECIMAL(5,2) NOT NULL
, date DATETIME NOT NULL
, PRIMARY KEY(id,date)
);

INSERT INTO my_table VALUES
(1   ,64.2   ,10.1  ,'2017-01-06 10:20:00'),
(2   ,20.2   ,2.5   ,'2017-01-06 10:19:30'),
(2   ,20.3   ,2.4   ,'2017-01-06 10:19:10'),
(1   ,63.8   ,10.0  ,'2017-01-06 10:19:00'),
(3   ,20.0   ,9.9   ,'2017-01-06 10:18:30'),
(2   ,20.1   ,2.4   ,'2017-01-06 10:18:00'),
(3   ,19.9   ,5.0   ,'2017-01-06 10:17:59');
这里有一个想法。它不能很好地扩展,只适用于“第二高结果”的特定示例,因此不能扩展到更一般的情况:

SELECT x.* 
  FROM my_table x 
  JOIN 
     ( SELECT a.id
            , MAX(a.date) date 
         FROM my_table a 
        WHERE date NOT IN (SELECT MAX(date) FROM my_table WHERE id = a.id GROUP BY id) 
        GROUP 
           BY id
     ) y 
    ON y.date = x.date 
   AND y.id = x.id;
+----+--------+--------+---------------------+
| id | value1 | value2 | date                |
+----+--------+--------+---------------------+
|  1 |  63.80 |  10.00 | 2017-01-06 10:19:00 |
|  2 |  20.30 |   2.40 | 2017-01-06 10:19:10 |
|  3 |  19.90 |   5.00 | 2017-01-06 10:17:59 |
+----+--------+--------+---------------------+
还有一个想法。它的伸缩性很好,并且很容易扩展到更一般的情况(例如,i=3):

这里有一个想法。它不能很好地扩展,只适用于“第二高结果”的特定示例,因此不能扩展到更一般的情况:

SELECT x.* 
  FROM my_table x 
  JOIN 
     ( SELECT a.id
            , MAX(a.date) date 
         FROM my_table a 
        WHERE date NOT IN (SELECT MAX(date) FROM my_table WHERE id = a.id GROUP BY id) 
        GROUP 
           BY id
     ) y 
    ON y.date = x.date 
   AND y.id = x.id;
+----+--------+--------+---------------------+
| id | value1 | value2 | date                |
+----+--------+--------+---------------------+
|  1 |  63.80 |  10.00 | 2017-01-06 10:19:00 |
|  2 |  20.30 |   2.40 | 2017-01-06 10:19:10 |
|  3 |  19.90 |   5.00 | 2017-01-06 10:17:59 |
+----+--------+--------+---------------------+
还有一个想法。它的伸缩性很好,并且很容易扩展到更一般的情况(例如,i=3):



请显示样本数据和预期输出。数据在哪里subquery@e4c5我认为OP正在设想另一种解决问题的方法,这将涉及子查询。这解释了很多,@TimBiegeleisensample数据已添加,是的,我还没有找到任何子查询yetPlease显示示例数据和预期输出。数据在哪里subquery@e4c5我认为OP正在设想另一种解决问题的方法,这将涉及子查询。这解释了很多,@TimBiegeleisensample添加了数据,是的,我还没有找到任何子查询,或者你可以只使用一个查询。创建一个临时表不是有点过分(我的意思是,它需要做很多事情,只是为了几件事),我可能会看一些视图。听起来很有趣。我理解了这个问题,问题是用一个id来限制和偏移,和另一个查询的相同限制和偏移量。在MySQL中,您无法在单个查询中实现这一点。在PostgreSQL中,您将使用CTE或窗口函数(取决于性能考虑)。但是,MySQL中没有这两个标准功能。或者你可以只使用一个查询,而不是创建一个临时表(我的意思是,它需要做很多事情,只是为了几件事),我可能会看一些视图,这听起来很有趣,因为我理解了这个问题,问题是限制和偏移一个id,和另一个查询的相同限制和偏移量。在MySQL中,您无法在单个查询中实现这一点。在PostgreSQL中,您将使用CTE或窗口函数(取决于性能考虑)。但是,这两种标准功能在MySQL中都不可用。但是,它们都工作得很好。回答得很好。解释第二个查询,如果任何id都有一条记录,它将返回什么?好问题Suraz。为什么不“吸一口看看”呢?第一个要花很长时间,所以我要用第二个谢谢!它不会返回任何值,只有当我们不想在单个记录的情况下返回任何值时才可以。尽管如此,我还是很感激和+1的回答:)效果很好。回答得很好。解释第二个查询,如果任何id都有一条记录,它将返回什么?好问题Suraz。为什么不“吸一口看看”呢?第一个要花很长时间,所以我要用第二个谢谢!它不会返回任何值,只有当我们不想在单个记录的情况下返回任何值时才可以。尽管如此,我还是感谢和+1的回答:)