РЕДАКТИРОВАТЬ: удалил большое число init и edd счетчик в тесте ifnull, поэтому он работает в чистом MySQL: ifnull(@prec,counter)
, а не ifnull(@prec,999999)
.
Если ваш старттаблица t1, и базовый запрос был:
select id,counter from t1 order by id;
Затем с помощью mysql-переменной вы можете выполнить работу:
SET @prec=NULL;
select * from (
select id,counter,@prec:= if(
ifnull(@prec,counter)>=counter,
counter,
-1) as prec
from t1 order by id
) t2 where prec<>-1;
за исключением здесь Iнужно 99999 в качестве максимального значения для вашего столбца , и, возможно, есть способ поместить инициализацию @prec
в NULL где-нибудь в 1-м запросе.
Здесь столбец prec содержит счетчик значений 1-й строки, а затем значение счетчика каждой строки, если оно меньше, чем значение из предыдущей строки, и -1, если это становится ложным.
Обновить
Внешний выбор можетбыть полностью удаленным, если назначение переменной выполняется в предложении WHERE
:
SELECT @prec := NULL;
SELECT
id,
counter
FROM t1
WHERE
(@prec := IF(
IFNULL(@prec, counter) >= counter,
counter,
-1
)) IS NOT NULL
AND @prec <> -1
ORDER BY id;
regilero РЕДАКТИРОВАТЬ: Я могу удалить 1-й запрос инициализации, используя временную таблицу (левое соединение)1 строка таким образом: но это может замедлить запрос, может быть.
(...)
FROM t1
LEFT JOIN (select @prec:=NULL as nullinit limit 1) as tmp1 ON tmp1.nullinit is null
(..)
Как сказал @Mike, используя простой запрос UNION или даже:
(...)
FROM t1 , (select @prec:=NULL) tmp1
(...)
лучше, если вы хотите избежать первого запроса.
Итак, в конце самое хорошее решение:
SELECT NULL AS id, NULL AS counter FROM dual WHERE (@prec := NULL)
UNION
SELECT id, counter
FROM t1
WHERE (
@prec := IF(
IFNULL(@prec, counter) >= counter,
counter,
-1 )) IS NOT NULL
AND @prec <> -1
ORDER BY id;
+--------+---------+
| id | counter |
+--------+---------+
| 353215 | 20 |
| 523532 | 10 |
| 535325 | 15 |
+--------+---------+
ОБЪЯСНИТЬ ВЫБРАТЬ вывод:
+----+--------------+------------+------+---------------+------+---------+------+------+------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+------------+------+---------------+------+---------+------+------+------------------+
| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE |
| 2 | UNION | t1 | ALL | NULL | NULL | NULL | NULL | 6 | Using where |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | Using filesort |
+----+--------------+------------+------+---------------+------+---------+------+------+------------------+