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

Тема в разделе "Базы данных", создана пользователем ShaDeRzz, 4 янв 2013.

Модераторы: latteo
  1. ShaDeRzz

    ShaDeRzz

    Регистр.:
    16 окт 2007
    Сообщения:
    176
    Симпатии:
    65
    Здравствуйте.
    имеется 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 уже это дело разбирать, предварительно вычислив соответствия дней недели по месяцам. Буду благодарен за ваши решения, алгоритмы или любые другие подсказки.
     
    latteo нравится это.
  2. Leony

    Leony

    Регистр.:
    18 мар 2008
    Сообщения:
    153
    Симпатии:
    25
    Ну выбрать строки за последние 3 м-ца легко:
    SELECT * FROM table WHERE date > SUBDATE(CURDATE(), INTERVAL 3 MONTH)
    Дальше нужно плясать с DAYNAME и эйлиасами.
     
  3. chiief

    chiief Писатель

    Регистр.:
    1 ноя 2011
    Сообщения:
    8
    Симпатии:
    3
    требования к структуре выдаче нужно уточнять, не в каждом месяце матрица дней подходит для линейного запроса
    количество конкретных дней недели в разных месяцах отличается, пустые значения должны быть ?
    ---
    вдогонку
    опять же неверно сформулирована зачача
    не понедельник месяца, а понедельник конкретной недели конкретного месяца, вопросы сортировки вывода тут вторичны

    еще момент
    таблицу нельзя расширить составным полем год,месяц, неделя, день недели ? денормализованно, но при запросе функциями не нужно будет извращаться
    вопрос объема фуллскана таблиц, за три месяца я так понимаю всего нужно ?
     
    ShaDeRzz нравится это.
  4. ShaDeRzz

    ShaDeRzz

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

    Или плох алгоритм?
     
  5. chiief

    chiief Писатель

    Регистр.:
    1 ноя 2011
    Сообщения:
    8
    Симпатии:
    3
    -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
    П.С. задача академически интересна или по быстрому надо приточить ?
    вьюшки можно создать с синхронизацией первого дня недели последнего месяца с двумя остальными

    в принципе эти функции дописывает народ руками http://club.shelek.ru/viewart.php?id=314#post_firstdayof
     
    ShaDeRzz нравится это.