2017-01-06 22 views
0

В настоящее время я использую несколько запросов, чтобы данные, как, что:SQL в операторе с ограничением и смещение для каждого элемента

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 

Я хотел бы, например (для каждого идентификатора я хотел бы иметь второго до последнего байта данных):

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 

Возможно ли это?

+0

Просьба показать образцы данных и ожидаемый результат. –

+0

Где находится подзапрос – e4c5

+0

@ e4c5 Я думаю, что ОП воображает альтернативный путь для решения своей проблемы, что связано с подзапросом. –

ответ

3
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'); 

Вот эта идея. Это не очень хорошо масштабируется, и работает только для конкретного примера «2» высокий результат, поэтому он не может быть распространена на более общий случай:

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:[email protected]+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 | 
+----+--------+--------+---------------------+ 
+0

работал хорошо. замечательный ответ. объяснять второй запрос рабочий PLZ –

+0

Что он вернет, если для любого идентификатора существует одна запись? – Susang

+0

Хороший вопрос Сура. Почему бы не «сосать и посмотреть»? – Strawberry

-1

Как я понимаю, вы хотите, чтобы ограничение и смещение применялись независимо к двум различным подмножествам вашего запроса. В большинстве РСУБД у вас будет какой-то подзапрос, который мог бы это сделать. Основными функциями, которые используются для других систем реляционных баз данных, являются функции окна и общие табличные выражения. MySQL еще не поддерживается.

Итак, ваша основная проблема заключается в том, что MySQL не поддерживает функции окна или общие выражения таблиц. Если бы одна из этих функций была поддержана, проблем не возникло бы.

Обход этого ограничения будет уродливым. Существует не очень красивый, элегантный способ сделать это. Однако вы можете решить это одним из двух способов.

Первый заключается в использовании временной таблицы для построения вашего результата, а во-вторых, для эмуляции общих табличных выражений путем создания представлений.

+0

Или вы можете просто использовать запрос. – Strawberry

+0

не создает временную таблицу, которая немного переборщила (я имею в виду, что мне кажется, что это нужно делать много всего для нескольких вещей), я могу взглянуть на то, как это интересно. –

+1

As Я понял вопрос, проблема заключалась в том, чтобы получить лимит и смещение на один id, и тот же предел и смещение другого запроса. вы не можете сделать это в MySQL в одном запросе. –

 Смежные вопросы

  • Нет связанных вопросов^_^