как следить за числами в MySQL

В базе данных у меня есть следующая проблема:

ID  premio ordenar precio Fecha       escala_Vencida
1   1      1       1000   30-12-2016  si
2   1      2       2000   30-12-2016  si
3   1      3       3000   30-12-2016  si
4   2      4       4000   30-12-2016  si
5   2      5       5000   30-12-2016  si
6   2      6       6000   30-12-2016  si
7   3      1       6000   30-1-2017   no
8   3      2       4000   30-1-2017   no
9   3      3       5000   30-1-2017   no
10  4      4       1000   30-1-2017   no
11  4      5       2000   30-1-2017   no
12  4      6       3000   30-1-2017   no

Мне нужно сделать так, чтобы приз был отсортирован, проблема в том, что кульминацией (Порядком) меня нужно сделать от меньшего к большему числу от 1 до бесконечности всякий раз, когда шкала не истекает, то есть эта отметка (НЕТ), а цена - от самой низкой до самой высокой, в этом случае число 6 представляет 2 разных приза, в случае первого приза порядок в порядке (от ID 1 до 6) но второй - грязный (от 7 до 12) - второй приз, который мне нужно вставить упорядоченно через вставку MySQL.

INSERT INTO TABLE
(
premio,
ordenar,
precio,
fecha,
escala_vencida,
)
VALUES
(
premio,
ordenar,<--- problema al ordenar
precio,
fecha,
escala_vencida,
)

ВАЖНО! ID уникален и не повторяется по всей таблице.

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

0
задан 14.01.2017, 17:19
0 ответов

В других базах данных существует статья OVER, которая определяет разделение или ранг стоимости, на которых применять функцию окна, или функцию атташе.

Например: Пронумеруй реестры, создавая разделение из-за escalaVencida, упорядоченный по цене. Или же, нумеруй пока он не меняет escalaVencida.

ROW_NUMBER () OVER (PARTITION BY escalaVencida ORDER BY оценил)

В MySql он не существует - функция и должна осуществляться используя переменные. Преимущество состоит в том, что переменные могут инициализироваться в том же решении SQL.

select 
       @ordenar := @ordenar + 1 as ordenar,
       ID, premio, precio, Fecha, escala_vencida
from
    (select @ordenar := 0) i,
    (select ID, premio, precio, Fecha, escala_Vencida 
     from premios 
     where escala_Vencida = 'no' 
     order by precio) t;


+---------+----+--------+--------+---------------------+----------------+
| ordenar | ID | premio | precio |        Fecha        | escala_vencida |
+---------+----+--------+--------+---------------------+----------------+
|    1    | 10 |    4   |  1000  | 30.01.2017 00:00:00 |       no       |
+---------+----+--------+--------+---------------------+----------------+
|    2    | 11 |    4   |  2000  | 30.01.2017 00:00:00 |       no       |
+---------+----+--------+--------+---------------------+----------------+
|    3    | 12 |    4   |  3000  | 30.01.2017 00:00:00 |       no       |
+---------+----+--------+--------+---------------------+----------------+
|    4    |  8 |    3   |  4000  | 30.01.2017 00:00:00 |       no       |
+---------+----+--------+--------+---------------------+----------------+
|    5    |  9 |    3   |  5000  | 30.01.2017 00:00:00 |       no       |
+---------+----+--------+--------+---------------------+----------------+
|    6    |  7 |    3   |  6000  | 30.01.2017 00:00:00 |       no       |
+---------+----+--------+--------+---------------------+----------------+

Ты можешь пытаться здесь: http://rextester.com/QWJG61661

0
ответ дан 03.12.2019, 17:40