Выборка и сравнение данных по дням недели

ShaDeRzz

Гуру форума
Регистрация
16 Окт 2007
Сообщения
177
Реакции
66
Здравствуйте.
имеется mysql таблица вида date (yyyy-mm-dd) | sum
Например
2012-10-11 | 2013.22
2012-10-12 | 6026.37
.....
2013-01-04 | 2011.02

Необходимо произвести выборку за последние 3 месяца и сопоставить данные по дням недели каждого месяца, да так, чтобы сумма первого понедельника текущего месяца (7 января 2013 года) сопоставлялась с суммой первого понедельника предыдущего месяца (3 декабря 2012) и с таким же понедельником позапрошлого месяца (5 ноября). И так со всеми днями месяца.

Получить в итоге хотелось бы что-то в виде
01.01.2013 | вт. | сумма по этому числу | 02.12.2012 | вт. | сумма по этому числу | 06.11.2012 | вт. | сумма за это число
02.01.2013 | ср. | .......

Я так полагаю, что нужно выбрать данные в диапазоне текущая дата минус 3 месяца, а потом уже средствами php уже это дело разбирать, предварительно вычислив соответствия дней недели по месяцам. Буду благодарен за ваши решения, алгоритмы или любые другие подсказки.
 
Ну выбрать строки за последние 3 м-ца легко:
SELECT * FROM table WHERE date > SUBDATE(CURDATE(), INTERVAL 3 MONTH)
Дальше нужно плясать с DAYNAME и эйлиасами.
 
требования к структуре выдаче нужно уточнять, не в каждом месяце матрица дней подходит для линейного запроса
количество конкретных дней недели в разных месяцах отличается, пустые значения должны быть ?
---
вдогонку
опять же неверно сформулирована зачача
не понедельник месяца, а понедельник конкретной недели конкретного месяца, вопросы сортировки вывода тут вторичны

еще момент
таблицу нельзя расширить составным полем год,месяц, неделя, день недели ? денормализованно, но при запросе функциями не нужно будет извращаться
вопрос объема фуллскана таблиц, за три месяца я так понимаю всего нужно ?
 
chiief, задачу постарался сформулировать максимально доходчиво.
По логике:
— выбираем данные за 3 последних месяца.
— загоняем данные в массив, где ключем будет strtotime от даты, а значением - сумма.
— вычисляем первый понедельник текущего месяца. вычисляем strtotime от этого значения. Обращаясь по полученному индексу можем вытянуть значение.
— Значения по датам "-1 MONTH" и "-2 MONTH" получаем соответственно:
PHP:
$date1 = strtotime('-1 month', $date);
$date2 = strtotime('-2 month', $date);
Соответственно, за значениями лезем в массив по этим ключам.
— И так в цикле до последней даты последнего выбранного месяца.

Или плох алгоритм?
 
-1 месяц от даты первого понедельника в феврале не равен первому понедельнику в январе
если сюда добавить поле индекса недели в месяце(не в году) то сортировка и выборка будет нужной для вывода

Код:
SELECT WEEKDAY(t1.DATE)+1 AS day1, EXTRACT(MONTH FROM t1.date) AS month1, t1.date, t1.value FROM test1 t1
ORDER BY day1, t1.date

П.С. задача академически интересна или по быстрому надо приточить ?
вьюшки можно создать с синхронизацией первого дня недели последнего месяца с двумя остальными

в принципе эти функции дописывает народ руками Для просмотра ссылки Войди или Зарегистрируйся
 
Назад
Сверху