目前我使用多个查询来获取这样的数据:
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/