|
|
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Возник вопрос, буду благодарен за помощь. Есть две таблицы: список платежных терминалов (devices) и список платежей (paylog). Необходима выборка по каждому терминалу сумма платежей за день, неделю, месяц, год и произвольный период с возможностью сортировки по любому полю. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Я составил вот такой запрос, и он вроде как работает. Но меня мучают сомнения, как оно поведет себя, когда в базе будет 10000 терминалов и 100000 платежей в каждом. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 09:25 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Пожалуйста, расскажите, если есть какой-то способ сделать это грамотнее и оптимальнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 09:26 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Нафига тут подзапросы? просто Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Условия в CASE формируются как граничные - от и до. Никаких функций от paylog.paydat. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 09:52 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Поскольку берутся данные по одному devices.uid - GROUP BY нафиг не нужен. А если надо получить по нескольким/всем - то добавить GROUP BY devices.uid (надеюсь, это поле - уникальное?). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 09:53 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Это в примере один uid. В норме uid будет BETWEEN x AND y. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 11:17 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
PS: uid - разумеется, уникальное поле. В таблице devices это primary key. А куда приспособить условие paylog.code = 1? В конец? WHERE paylog.uid = devices.uid AND devices.uid = 1 AND paylog.code = 1 Так? И в таком случае выведет ли с нулями те девайсы, для которых нет подходящих по условиям записей в paylog? (должно выводить все девайсы, чей uid попадает в заданный диапазон). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 11:25 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Вы слишком упростили задачу, получив неадекватную модель и, соответственно, неадекватное начальной задаче решение. Старайтесь всегда сперва думать, сможете ли применить ответ... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Список отбора может задаваться как фиксированным набором IN (), так и диапазоном BETWEEN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 11:45 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Я же вроде указал, что для выборки из devices может быть (а может не быть) несколько условий, по city, area, диапазону uid. Вот про диапазон uid да, не сказал. Тогда еще пара вопросов: почему COALESCE? Вроде же IFNULL должно быть достаточно. И еще, если сделать так: Код: sql 1. 2. 3. 4. не будет ли лучше, чем в четырех выборках (текущие день, неделя, месяц и год) указывать функцию каждый раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 12:02 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Tachyonдля выборки из devices может быть (а может не быть) несколько условий, по city, area, диапазону uid.Это всё запихивается во WHERE. Tachyonесли сделать такНе страдайте ерундой. Это же для каждого отдельно взятого запроса константа, которая вычисляется один раз на запрос. А если притянуть переменные, мало того, что прозрачность запроса пострадает, так ещё ведь неизвестно, что взбредёт в голову планировщику - а ну как он начнёт всю эту ерунду вычислять для каждой записи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 12:21 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Ок, понял, большое спасибо. Может быть, еще подскажете, как грамотно сформировать диапазоны (сегодня 00:00:00) - (сегодня 23:59:59); (последний понедельник 00:00:00) - (сегодня 23:59:59); (1 число последнего месяца 00:00:00) - (сегодня 23:59:59); (1 января последнего года 00:00:00) - (сегодня 23:59:59); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 12:37 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
У меня получается как-то так, но, может быть, есть варианты оптимальнее? Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 13:28 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
PS: Точнее, я читал, что в любом случае лучше приводить к DATETIME, тогда получается вот так: Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 13:37 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Tachyonсегодня 00:00:00CURRENT_DATE Tachyonсегодня 23:59:59CURRENT_DATE + INTERVAL 1 DAY - INTERVAL 1 SECOND Tachyonпоследний понедельник 00:00:00CURRENT_DATE - INTERVAL DAYOFWEEK(CURRENT_DATE) - 2 DAY Tachyon1 число последнего месяца 00:00:00CURRENT_DATE - INTERVAL DAY(CURRENT_DATE) - 1 DAY Tachyon1 января последнего года 00:00:00CURRENT_DATE - INTERVAL DAYOFYEAR(CURRENT_DATE) - 1 DAY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 13:52 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Спасибо. Понятия не имею насчет производительности, но выглядит намного красивше. Тогда последний вопрос: следует ли подобные выражения заключать в скобки в выражении between? BETWEEN (выражение1) AND (выражение2) или для интерпретатора MySQL разницы нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 14:12 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Хочется - заключай, не хочется - не заключай. Парсеру пофиг. Можно вообще изобрести нечто вроде Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 14:36 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Теперь все ясно. Спасибо, попробую применить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2018, 14:50 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
Здравствуйте еще раз. С вашего позволения, задам еще один вопрос на эту же тему. Идея следующая: в таблице devices, упоминавшейся выше, есть поле status TINYINT(1), принимающее значение NULL или 1 в зависимости от того, онлайн или оффлайн данный терминал в настоящее время. Для проверки и обновления статуса мое начальство задвинуло следующую идею: все терминалы (10000 или сколько их там планируется) раз в 30 секунд шлют на сервер NOW() в поле типа TIMESTAMP, находящейся в таблице типа MEMORY. Код: sql 1. 2. 3. 4. 5. А на сервере крутится в цикле скрипт, который раз в 30 секунд проверяет таблицу ping и сравнивает ее с devices, и только в случае изменений обновляет поле status в таблице devices. Идея всей этой запутки в том, что начальство беспокоится за твердотельный накопитель на сервере, который может помереть от частых (20000 в минуту) перезаписываний в одно и то же место. У меня есть крепкое подозрение, что это ерунда, и что в результате выйдет то на то, но аргументированно доказать это не могу, так что приходится делать, как велено. В результате, каждый терминал будет слать на сервер запросы вида Код: sql 1. А теперь самое главное, в чем заключается вопрос: запрос, выполняющийся на сервере, должен делать следующее: (devices.uid = ping.uid, уникальное значение) 1) если devices.status IS NULL, а ping.ping не старее 90 секунд, то devices.status меняется на 1 (устройство онлайн). 2) если devices.status = 1, а ping.ping старее 90 секунд или отсутствует для данного uid, то devices.status меняется на NULL. Я экспериментирую с запросами типа Код: sql 1. 2. 3. 4. Но с двумя JOIN выходит ерунда. Два отдельных запроса использовать не хотелось бы, все-таки этот скрипт должен выполняться раз в 30 секунд на довольно толстой (теоретически) базе. Может быть, вы подскажете мне какую-нибудь идею? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 15:02 |
|
||
|
Выбор нескольких подмножеств из подмножества
|
|||
|---|---|---|---|
|
#18+
PS: Основная идея, на всякий случай еще раз поясню, в том, что если devices.status = 1, то он должен перезаписываться только на NULL и только тогда, когда связь с девайсом пропала. И наоборот. Во всех остальных случаях запись должна игнорироваться, 1 на 1 и NULL на NULL не перезаписываться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 15:07 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39707474&tid=1829570]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 131ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...