
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
26.10.2015, 23:52:14
|
|||
|---|---|---|---|
|
|||
Проблема в составлении запроса, которая, очевидно, больше моего мозга |
|||
|
#18+
Доброго времени суток. Я далеко не мастер мускула в сложных запросах или даже просто когда нужны джоины - стопорюсь, посему нужна ваша помощь. Есть таблица в БД, записи в которой имеют столбец даты в формате unix. Нужно получить список, скажем, 30 последних дней с количеством записей привязанных к этому дню тем самым столбцом даты. Причем если в какой то день записей не было, нужно получить таки строчку с 0. 30 дней - это должен быть параметр. вместо дня тоже хотелось бы иметь возможность подставить любой интервал. Сам я дошел пока только до такого: SELECT COUNT(id) FROM table WHERE 1 GROUP BY date/(60*60*24) ORDER BY date DESC LIMIT 30 это выдает количество записей в дни, с которыми есть хоть бы одна запись, пропуская дни с 0 записей. Плюс в выдачу пролезают лишние строчки - дни более месячной давности. размышления привели меня к такому возможному решению: если добавить условие WHERE date>UNIX_TIMESTAMP()-(30)*(60*60*24) - то не будут возвращаться лишние строчки и мускул не работает лишнего. Теперь уже я гипотетически могу силами пхп добавить сколько надо нулевых дней и отсортировать их в нужной последовательности. Вот только это дико некрасивое решение. Подскажите как грамотнее решить эту проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2015, 00:00:22
|
|||
|---|---|---|---|
Проблема в составлении запроса, которая, очевидно, больше моего мозга |
|||
|
#18+
Ну, т.к. вам требуются даты, которые явно отсутствуют в исходных данных, то скорее всего вам не поможет ничего, кроме внешнего джойна с заранее сгенерированной таблицей с датами. Тут уже два варианта: 1) Генерить таблицу с датами за указанный период на лету (можно поискать решения в интернете) 2) Иметь в БД заранее сгенеренную таблицу с датами на десяток лет назад/вперед, в зависимости от того, какие периоды предполагаются в исходных данных. Второй вариант при наличии индекса и заранее наложенных ограничениях на период будет скорее всего быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2015, 00:08:05
|
|||
|---|---|---|---|
|
|||
Проблема в составлении запроса, которая, очевидно, больше моего мозга |
|||
|
#18+
anvano, Прошу прощения, но это выглядит не менее кривым решением, чем добавление отсутствующих дат средствами пхп. Значит, вариантов нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2015, 00:20:59
|
|||
|---|---|---|---|
Проблема в составлении запроса, которая, очевидно, больше моего мозга |
|||
|
#18+
Ну, наличие в БД заранее заполненной таблицы с днями на несколько лет - вполне себе стандартное решение для такого рода задач. Ничего в этом особо кривого нет. Более того, в эту табличку можно всякие доп. данные по дням внести, заранее предрасчитанные, типа является ли день праздником или выходным днем и т.п. что тоже может использоваться в отчетах/расчетах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2015, 00:30:42
|
|||
|---|---|---|---|
|
|||
Проблема в составлении запроса, которая, очевидно, больше моего мозга |
|||
|
#18+
anvano, Правда? А я, когда мне друг рассказывал о наличии такой таблицы с выходными днями, посчитал что он вероятно меня разыгрывает. Хорошо, подумаю об этом, больше спасибо. А как должен выглядет запрос при наличии такой таблицы? - в джойнах я не силен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2015, 00:34:04
|
|||
|---|---|---|---|
|
|||
Проблема в составлении запроса, которая, очевидно, больше моего мозга |
|||
|
#18+
а еще, неужели в мускуле нет подобия функции range из php? range(5,9); // ~~ array(5,6,7,8,9); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2015, 00:51:55
|
|||
|---|---|---|---|
Проблема в составлении запроса, которая, очевидно, больше моего мозга |
|||
|
#18+
Готовый код для создания и заполнения таблицы с датами за любой период Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. При наличии таблицы внешнее соединение типа такого (если в t.date у вас правда линуксовый timestamp) Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2015, 01:01:33
|
|||
|---|---|---|---|
Проблема в составлении запроса, которая, очевидно, больше моего мозга |
|||
|
#18+
лимит уже выполняет функцию ограничения: Код: sql 1. если мы сами фильтруем, то лимит лишний Код: sql 1. 2. 3. neigenoirВот только это дико некрасивое решение. Подскажите как грамотнее решить эту проблему? Это наоборот дико красивое решение и так делают все трудяги. Любые танцы доп.таблицами - это наоборот снижает красоту. Код: php 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2015, 02:13:21
|
|||
|---|---|---|---|
|
|||
Проблема в составлении запроса, которая, очевидно, больше моего мозга |
|||
|
#18+
anvano, огромное спасибо. Вроде все понял и осознал. Благо, времени на проект еще прорва - попробую. Lumix, Примерно так у меня и сделано, только одним циклом и без необходимости сортировки. Зато памяти больше жрет. И восприятие красоты мне похоже тоже ближе ваше, однако возможно, это только потому что я никогда не пробовал такие статик таблицы, да и на джойны не охота идти. Так что пока есть время - буду пробовать. Еще раз всем спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.10.2015, 09:05:06
|
|||
|---|---|---|---|
Проблема в составлении запроса, которая, очевидно, больше моего мозга |
|||
|
#18+
neigenoirэто выглядит не менее кривым решением, чем добавление отсутствующих дат средствами пхп. Перекладывание на клиента работы по обработке данных, которые ДОЛЖНЫ обрабатываться на сервере - именно это и есть КРИВОЕ решение. anvanoГотовый код для создания и заполнения таблицы с датами за любой период Перед циклом заполнения таблицы calendar надо сделать её TRUNCATE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=47&mobile=1&tid=1832573]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 370ms |

| 0 / 0 |
