|
|
|
Проблема в составлении запроса, которая, очевидно, больше моего мозга
|
|||
|---|---|---|---|
|
#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) - то не будут возвращаться лишние строчки и мускул не работает лишнего. Теперь уже я гипотетически могу силами пхп добавить сколько надо нулевых дней и отсортировать их в нужной последовательности. Вот только это дико некрасивое решение. Подскажите как грамотнее решить эту проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 23:52:14 |
|
||
|
Проблема в составлении запроса, которая, очевидно, больше моего мозга
|
|||
|---|---|---|---|
|
#18+
Ну, т.к. вам требуются даты, которые явно отсутствуют в исходных данных, то скорее всего вам не поможет ничего, кроме внешнего джойна с заранее сгенерированной таблицей с датами. Тут уже два варианта: 1) Генерить таблицу с датами за указанный период на лету (можно поискать решения в интернете) 2) Иметь в БД заранее сгенеренную таблицу с датами на десяток лет назад/вперед, в зависимости от того, какие периоды предполагаются в исходных данных. Второй вариант при наличии индекса и заранее наложенных ограничениях на период будет скорее всего быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 00:00:22 |
|
||
|
Проблема в составлении запроса, которая, очевидно, больше моего мозга
|
|||
|---|---|---|---|
|
#18+
anvano, Прошу прощения, но это выглядит не менее кривым решением, чем добавление отсутствующих дат средствами пхп. Значит, вариантов нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 00:08:05 |
|
||
|
Проблема в составлении запроса, которая, очевидно, больше моего мозга
|
|||
|---|---|---|---|
|
#18+
Ну, наличие в БД заранее заполненной таблицы с днями на несколько лет - вполне себе стандартное решение для такого рода задач. Ничего в этом особо кривого нет. Более того, в эту табличку можно всякие доп. данные по дням внести, заранее предрасчитанные, типа является ли день праздником или выходным днем и т.п. что тоже может использоваться в отчетах/расчетах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 00:20:59 |
|
||
|
Проблема в составлении запроса, которая, очевидно, больше моего мозга
|
|||
|---|---|---|---|
|
#18+
anvano, Правда? А я, когда мне друг рассказывал о наличии такой таблицы с выходными днями, посчитал что он вероятно меня разыгрывает. Хорошо, подумаю об этом, больше спасибо. А как должен выглядет запрос при наличии такой таблицы? - в джойнах я не силен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 00:30:42 |
|
||
|
Проблема в составлении запроса, которая, очевидно, больше моего мозга
|
|||
|---|---|---|---|
|
#18+
а еще, неужели в мускуле нет подобия функции range из php? range(5,9); // ~~ array(5,6,7,8,9); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 00:34:04 |
|
||
|
Проблема в составлении запроса, которая, очевидно, больше моего мозга
|
|||
|---|---|---|---|
|
#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, 00:51:55 |
|
||
|
Проблема в составлении запроса, которая, очевидно, больше моего мозга
|
|||
|---|---|---|---|
|
#18+
лимит уже выполняет функцию ограничения: Код: sql 1. если мы сами фильтруем, то лимит лишний Код: sql 1. 2. 3. neigenoirВот только это дико некрасивое решение. Подскажите как грамотнее решить эту проблему? Это наоборот дико красивое решение и так делают все трудяги. Любые танцы доп.таблицами - это наоборот снижает красоту. Код: php 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 01:01:33 |
|
||
|
Проблема в составлении запроса, которая, очевидно, больше моего мозга
|
|||
|---|---|---|---|
|
#18+
anvano, огромное спасибо. Вроде все понял и осознал. Благо, времени на проект еще прорва - попробую. Lumix, Примерно так у меня и сделано, только одним циклом и без необходимости сортировки. Зато памяти больше жрет. И восприятие красоты мне похоже тоже ближе ваше, однако возможно, это только потому что я никогда не пробовал такие статик таблицы, да и на джойны не охота идти. Так что пока есть время - буду пробовать. Еще раз всем спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 02:13:21 |
|
||
|
Проблема в составлении запроса, которая, очевидно, больше моего мозга
|
|||
|---|---|---|---|
|
#18+
neigenoirэто выглядит не менее кривым решением, чем добавление отсутствующих дат средствами пхп. Перекладывание на клиента работы по обработке данных, которые ДОЛЖНЫ обрабатываться на сервере - именно это и есть КРИВОЕ решение. anvanoГотовый код для создания и заполнения таблицы с датами за любой период Перед циклом заполнения таблицы calendar надо сделать её TRUNCATE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2015, 09:05:06 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=47&tid=1832573]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 292ms |

| 0 / 0 |
