mysql - sql in 运算符,每个元素都有限制和偏移量

标签 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

但很明显,由于偏移参数,它无法工作,所以我无法让任何东西正常工作,我以为我可以使用一些子查询,但 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,我想要倒数第二个数据):

2   20.3   2.4   2017-01-06 10:19:10
1   63.8   10.0  2017-01-06 10:19:00
3   19.9   5.0   2017-01-06 10:17:59

这可能吗?

最佳答案

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 id
     , value1
     , value2
     , date 
  FROM 
     ( SELECT x.*
            , CASE WHEN @prev=id THEN @i:=@i+1 ELSE @i:=1 END i
            , @prev := id prev 
         FROM my_table x
            , ( SELECT @prev:=null,@i:=0) vars ORDER BY id,date DESC ) a 
        WHERE i = 2;
+----+--------+--------+---------------------+
| 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 |
+----+--------+--------+---------------------+

关于mysql - sql in 运算符,每个元素都有限制和偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41502475/

相关文章:

sql-server-2008 - 如何在同一查询中引用另一列中的聚合列?

mysql - SQL:查找商店的唯一客户时出现问题

php - CakePHP 中的数据并发管理 - 行为/ Controller /模型?

python - 在数据库中保存不同的文本。 Django

Java JDBC SQL 异常

mysql - 选择 WHERE 子句,拆分列值并检查

mysql - 在这种情况下我是否使用命令 "sum"?

php - mysql 结果总数未正确显示

sql - pl Sql developer 在新窗口获取查询结果

mysql - 选择 * 重复项,然后选择 * 非重复项 - mysql