Mysql Сетка цен. Выбрать актуальные цены на указанную дату

94
12 марта 2021, 01:50

Существует такая таблица в mysql:

mysql> SHOW COLUMNS FROM grids;
+---------------+-----------+------+-----+---------+----------------+
| Field         | Type      | Null | Key | Default | Extra          |
+---------------+-----------+------+-----+---------+----------------+
| id            | bigint(20)| NO   | PRI | NULL    | auto_increment |
| level         | int(11)   | NO   |     | NULL    |                |
| summ          | int(11)   | NO   |     | NULL    |                |
| activate_at   | timestamp | YES  |     | NULL    |                |
+---------------+-----------+------+-----+---------+----------------+

Имеются такие данные:

mysql> SELECT * FROM grids;
    +----+--------+--------+-------------------+
    | id | level  | summ   | activate_at       |
    +----+--------+--------+-------------------+
    | 6  |    1   |120 000 |2019-06-01 00:00:00|
    | 7  |    2   | 30 000 |2019-06-01 00:00:00|
    | 8  |    3   | 10 000 |2019-06-01 00:00:00|
    | 9  |    4   |  5 000 |2019-06-01 00:00:00|
    | 10 |    5   |  2 500 |2019-06-01 00:00:00|
    | 11 |    6   |  1 250 |2019-06-01 00:00:00|
    | 12 |    7   |    625 |2019-06-01 00:00:00|
    | 13 |    8   |    313 |2019-06-01 00:00:00|
    | 14 |    5   |  2 600 |2019-06-10 00:00:00|
    | 15 |    4   | 33 000 |2019-06-26 00:00:00|
    +----+--------+--------+-------------------+

Помогите выбрать актуальные данные за все level на нужную дату + отсортированные по level.

Т.е. если мне надо получить ценовую сетку на дату "2019-06-02" я должен получить такие данные:

    +----+--------+--------+-------------------+
    | id | level  | summ   | activate_at       |
    +----+--------+--------+-------------------+
    | 6  |    1   |120 000 |2019-06-01 00:00:00|
    | 7  |    2   | 30 000 |2019-06-01 00:00:00|
    | 8  |    3   | 10 000 |2019-06-01 00:00:00|
    | 9  |    4   |  5 000 |2019-06-01 00:00:00|
    | 10 |    5   |  2 500 |2019-06-01 00:00:00|
    | 11 |    6   |  1 250 |2019-06-01 00:00:00|
    | 12 |    7   |    625 |2019-06-01 00:00:00|
    | 13 |    8   |    313 |2019-06-01 00:00:00|
    +----+--------+--------+-------------------+

Если надо получить данные на дату "2019-06-12", я должен получить данные:

    +----+--------+--------+-------------------+
    | id | level  | summ   | activate_at       |
    +----+--------+--------+-------------------+
    | 6  |    1   |120 000 |2019-06-01 00:00:00|
    | 7  |    2   | 30 000 |2019-06-01 00:00:00|
    | 8  |    3   | 10 000 |2019-06-01 00:00:00|
    | 9  |    4   |  5 000 |2019-06-01 00:00:00|
  **| 14 |    5   |  2 600 |2019-06-10 00:00:00|**
    | 11 |    6   |  1 250 |2019-06-01 00:00:00|
    | 12 |    7   |    625 |2019-06-01 00:00:00|
    | 13 |    8   |    313 |2019-06-01 00:00:00|
    +----+--------+--------+-------------------+

И если мне надо получить текущие цены, т.е. на сегодня "2019-06-28":

    +----+--------+--------+-------------------+
    | id | level  | summ   | activate_at       |
    +----+--------+--------+-------------------+
    | 6  |    1   |120 000 |2019-06-01 00:00:00|
    | 7  |    2   | 30 000 |2019-06-01 00:00:00|
    | 8  |    3   | 10 000 |2019-06-01 00:00:00|
  **| 15 |    4   | 33 000 |2019-06-26 00:00:00|**
  **| 14 |    5   |  2 600 |2019-06-10 00:00:00|**
    | 11 |    6   |  1 250 |2019-06-01 00:00:00|
    | 12 |    7   |    625 |2019-06-01 00:00:00|
    | 13 |    8   |    313 |2019-06-01 00:00:00|
    +----+--------+--------+-------------------+
Answer 1

Простая выборка с сортировкой:

SELECT * FROM grids WHERE activate_at <= *date* AND activate_at IS NOT NULL ORDER BY level

Например, чтобы выбрать все записи до сегодняшней даты надо написать:

SELECT * FROM grids WHERE activate_at <= now() AND activate_at IS NOT NULL ORDER BY level
Answer 2

Если можно привязаться к id (т.е. они увеличиваются со временем, а не идут в разнобой) то должен подойти такой запрос:

SELECT level, summ, activate_at, id 
FROM grids 
WHERE 
id in (select max(id) from grids where activate_at <= now() group by level)
READ ALSO
Как сделать join один ко многму и взять только одно поле?

Как сделать join один ко многму и взять только одно поле?

Есть таблица users и user_phones (один ко многому), как получить список где каждый user имел бы только один номер ?

112
MySQL Update set

MySQL Update set

Всем приветТакая задача:

107
Разложить данные в таблицу на сайт

Разложить данные в таблицу на сайт

Через api получил такие данные

112
Перенос данных из одного массива в другой и сложное условие

Перенос данных из одного массива в другой и сложное условие

Суть: переносил сайт с одной CMS на другую (с самописной на Modx)Спустя некоторое время, потребовалось доперенести некоторые данные

97