Правильное оформление запроса MYSQL

127
16 сентября 2021, 13:20

Правильно ли такое оформление запроса? Выводит пустую таблицу при добавлении: HAVING datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR); Или подскажите как отобрать данные за последний час?

sql = """
SELECT STR_TO_DATE(CONCAT(date, time), '%d.%m.%Y%h:%i:%s') AS datetime,
    last,
    vol,
    oper
    FROM all_trades
    HAVING datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR);
"""

Пример данных до запроса:

             date      time    last  vol  oper
0      14.10.2019  10:48:03  132330    1     S
1      14.10.2019  10:00:00  132840   24     B
2      14.10.2019  10:48:03  132330    1     B
3      14.10.2019  10:00:00  132840    1     S
4      14.10.2019  10:00:00  132830    1     S

Пример данных после запроса:

                 datetime    last  vol  oper
0     2019-10-14 10:48:03  132330    1     S
1     2019-10-14 10:00:00  132840   24     B
2     2019-10-14 10:48:03  132330    1     B
3     2019-10-14 10:00:00  132840    1     S
4     2019-10-14 10:00:00  132830    1     S

DDL таблицы:

+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| date  | text       | YES  |     | NULL    |       |
| time  | text       | YES  |     | NULL    |       |
| last  | int(11)    | YES  |     | NULL    |       |
| vol   | int(11)    | YES  |     | NULL    |       |
| oper  | varchar(7) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+

Полное оформление запроса:

connection = pymysql.connect(host='localhost', user='root', passwd='******', db='quotes')
sql = """
SELECT STR_TO_DATE(CONCAT(date, time), '%d.%m.%Y%h:%i:%s') AS datetime,
    last,
    vol,
    oper
    FROM all_trades
    HAVING datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR);
"""
df = pd.io.sql.read_sql(sql, connection)
connection.close()
Answer 1

Ваш запрос мягко говоря "не оптимален". Использую having, получается что базе данных приходится сначала преобразовать всю вашу таблицу к нужному виду, а потом уже отсекать лишние данные. Если таблица будет более менее большая, то ваш запрос начнет дико тормозить. Для оптимизации вашего запроса, для начала предлагаю отсечь всё по дате добавив:

WHERE DATE_FORMAT(NOW(), '%d.%m.%Y') = date

Это уже сильно снизит количество обрабатываемых данных.

А чтобы сделать отсчеку по времени, можно использовать сравнение строк:

and DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 HOUR), '%H:%i:%s') < time

Только надо следить, чтобы данные в сравнении точно совпадали по формату.

Единственно, что в этом случае не будет работать переход на новую дату. Но и тут можно что-нибудь придумать не используя having.

READ ALSO
Как получить из коллекции по ключю name? Laravel

Как получить из коллекции по ключю name? Laravel

Как получить из коллекции по ключю name? Laravel

83
Вывод сравнение таблиц mysql

Вывод сравнение таблиц mysql

если есть две записи в таблице, допустим в dating: 1 запись (id=1, user_id=10, user_id_from=14) 2 запись (id=2, user_id=14, user_id_from=10) это значит что у пользователей совпали...

100
Разобрать php массив

Разобрать php массив

Ребят подскажите пожалуйста как разобрать многомерный массив с помощью php

132
Как получить Instagram access_token в правильном формате?

Как получить Instagram access_token в правильном формате?

После авторизации в Instagram я получаю access_token но проблема в том что я получаю его в следующем формате:

249