Получить текущий и следующий ряд и сравнить в цикле - PullRequest
0 голосов
/ 13 января 2020

Я хотел бы сравнить два значения из таблицы:

Это моя таблица:

ID;VALUE
1;700
2;600
3;800
4;900

Это мой запрос:

$stmt = $db->query("SELECT ID, VALUE FROM TABLE);

Теперь я нравится сравнивать результат текущей строки со следующей строкой. В mysql это было легко, потому что мне нужно установить номер строки. Я не нашел решения с помощью PDO.

Это мой код:

while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
      $id = $row["ID"];
      $val_current = $row["VALUE"];
      $row_next = $stmt->fetch(PDO::FETCH_ASSOC);
      $val_next = $row["VALUE"];
      if ($val_current > $val_next){
         echo "$id is greate!";
      }else{
         echo "$id is less!";
      }
}

Результат:

1 is greater
3 is less

Он пропустил, чтобы проверить ID 2 ID 3 с повтором, потому что я получаю следующий элемент в то время как l oop. Поэтому я получаю его, чтобы получить следующее значение, и снова получаю в l oop. Могу ли я переместить курсор в конец l oop?

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Если вы работаете MySQL 8.0, это просто с оконной функцией lead():

select 
    t.*,
    (value - lead(value) over(order by id) > 0) is_greater
from mytable t

Это дает вам логический флаг с именем is_greater, со следующими возможными значениями:

  • 1: это значение больше следующего
  • 0: это значение меньше следующего
  • null: следующего значения нет

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

ID | VALUE | is_greater
-: | ----: | ---------:
 1 |   700 |          1
 2 |   600 |          0
 3 |   800 |          0
 4 |   900 |       <em>null</em>

В более ранних версиях один вариант это использовать коррелированный подзапрос:

select 
    t.*,
    (value - (
        select t1.value 
        from mytable t1 
        where t1.id > t.id 
        order by t1.id limit 1
    ) > 0) is_greater
from mytable t
1 голос
/ 13 января 2020

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

$row = null;
while($row_next = $stmt->fetch(PDO::FETCH_ASSOC)) {
    if ($row !== null)) {
        $id = $row["ID"];
        $val_current = $row["VALUE"];
        $val_next = $row_next["VALUE"];
        if ($val_current > $val_next){
            echo "$id is greater!";
        }else{
            echo "$id is less!";
        }
        echo "\n";
    }
    $row = $row_next;
}
...