Выберите строку на основе условий для следующей строки - PullRequest
0 голосов
/ 12 ноября 2018

Вот часть моей таблицы MySQL:

| id   | opentrap | openrect | lampgroen | lamprood | closeout | openout | limitswitchclose | limitswitchopen | traploop | photocells | rectloop | DateTime            | milliseconds |
|   92 |        0 |        0 |         1 |        1 |        0 |       1 |                0 |               1 |        1 |          1 |        1 | 2018-11-09 13:56:41 |          654 |
|   93 |        0 |        0 |         1 |        1 |        0 |       1 |                0 |               1 |        1 |          1 |        1 | 2018-11-09 13:56:42 |          262 |
|   94 |        0 |        0 |         1 |        1 |        0 |       1 |                0 |               1 |        0 |          0 |        1 | 2018-11-09 13:56:42 |          561 |
|   95 |        0 |        0 |         1 |        1 |        0 |       0 |                0 |               1 |        0 |          0 |        0 | 2018-11-09 13:56:45 |           83 |
|   96 |        0 |        0 |         1 |        1 |        0 |       1 |                0 |               1 |        1 |          0 |        0 | 2018-11-09 13:56:46 |          189 |
|   97 |        0 |        0 |         1 |        1 |        0 |       1 |                0 |               1 |        1 |          1 |        0 | 2018-11-09 13:56:47 |          402 |
|   98 |        0 |        0 |         1 |        1 |        0 |       1 |                0 |               1 |        0 |          1 |        1 | 2018-11-09 13:56:48 |          611 |
|   99 |        0 |        0 |         1 |        1 |        0 |       1 |                0 |               1 |        0 |          0 |        1 | 2018-11-09 13:56:48 |          916 |

Я хочу выбрать строку на основе множества условий и на основе, если следующая строка traploop = 1 или rectloop = 1

Запрос, который я хочу использовать, выглядит следующим образом (но я не могу понять, как написать условие для следующей строки):

SELECT * 
FROM table 
WHERE closeout = 0 
    AND openout = 0 
    AND lampgroen = 1 
    AND lamprood = 1 
    AND limitswitchopen = 1 
    AND NEXTROW: traploop = 1 
    OR rectloop = 1;

Это должно дать мне:

|   95 |        0 |        0 |         1 |        1 |        0 |       0 |                0 |               1 |        0 |          0 |        0 | 2018-11-09 13:56:45 |           83 |

Ответы [ 5 ]

0 голосов
/ 12 ноября 2018

Это то, что вам нужно:

SELECT t0.*
FROM
  table t0
  INNER JOIN
  table t1
  ON t0.id + 1 = t1.id
WHERE
  t0.closeout = 0 AND
  t0.openout = 0 AND
  t0.lampgroen = 1 AND
  t0.lamprood = 1 AND
  t0.limitswitchopen = 1 AND
  (t1.traploop = 1 OR t1.rectloop = 1);
0 голосов
/ 12 ноября 2018

Вы можете попробовать с Коррелированный подзапрос с Exists ()

SELECT t1.* 
FROM table AS t1
WHERE t1.closeout = 0 AND 
      t1.openout = 0 AND 
      t1.lampgroen = 1 AND 
      t1.lamprood = 1 AND 
      t1.limitswitchopen = 1 AND 
      EXISTS (SELECT 1 
              FROM table AS t2 
              WHERE t2.id = t1.id + 1 AND 
                    (t2.traploop = 1 OR t2.rectloop = 1)
             )

PS: предполагается, что в столбце id нет пробелов

0 голосов
/ 12 ноября 2018

Простой запрос, который использует коррелированные подзапросы, но работает, если у идентификаторов есть пробелы, это:

SELECT *
FROM t AS curr
WHERE closeout = 0 AND openout = 0 AND lampgroen = 1 AND lamprood = 1 AND limitswitchopen = 1
AND 1 = (
    SELECT CASE WHEN traploop = 1 OR rectloop = 1 THEN 1 END
    FROM t AS next
    WHERE id > curr.id
    ORDER BY id
    LIMIT 1
)

Демонстрация на DB Fiddle

0 голосов
/ 12 ноября 2018

Вот один подход, использующий коррелированные подзапросы:

SELECT *
FROM yourTable t1
WHERE closeout = 0 AND openout = 0 AND lampgroen = 1 AND lamprood = 1 AND
    limitswitchopen = 1 AND
    ((SELECT t2.traploop FROM yourTable t2
     WHERE t2.id > t1.id ORDER BY t2.id LIMIT 1) = 1 OR
    (SELECT t2.rectloop FROM yourTable t2
     WHERE t2.id > t1.id ORDER BY t2.id LIMIT 1) = 1);

Демонстрация

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

0 голосов
/ 12 ноября 2018

Вы можете получить «следующую» строку, используя join - при условии, что «следующая» основана на id и в которой нет пробелов:

select . . . 
from t join
     tnext
     on tnext.id = t.id + 1
where . . .;

Затем вы можете применить условия либо к t, либо к tnext.

В MySQL 8+ лучшей альтернативой будет lead().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...