Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите решить задачу по выборке

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
phpself
Отправлено: 02 Сентября, 2010 - 11:35:30
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




Добрый день. Задание состоит в том, что бы из базы выбрать все транзакции и отсортировать их по дням.

таблица БД:

bid uid dtime amount method payid bonus
1 8 2010-07-01 13,00 3 н\а 3,00
2 8 2010-07-01 15,00 2 н\а 5,00
3 8 2010-07-01 18,00 1 н\а 6,00
3 9 2010-07-02 17,00 4 н\а 7,00

Как должно выглядеть в хтмль:

Дата пополнения Карточка Webmoney Терминал Счет ИТОГО
2010-07-01 18,00|6,00 15,00|5,00 13,00|3,00 0|0 36,00|14,00
2010-07-02 0|0 0|0 0|0 17,00|7,00

Применял запрос:

$query = "SELECT dtime, SUM(amount), SUM(bonus), method
FROM fn.fn_balance_in
WHERE TO_DAYS('2010-07-01') - TO_DAYS(dtime) <= 30
GROUP BY DATE_FORMAT(dtime, '%Y-%m-%d')";

$result = mysql_query($query);
(Добавление)
что то мои таблицы, особенно вторую скосило...

сумма|бонус - к каждому методу платежа
 
 Top
duk
Отправлено: 02 Сентября, 2010 - 11:55:13
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Февр. 2010  
Откуда: Москва


Помог: 3 раз(а)




фраза
GROUP BY DATE_FORMAT(dtime, '%Y-%m-%d')";
смысла не имеет. Группировать надо по полю, которое получится в результате выборки, например GROUP BY dtime
А вообще не понятно, как в хтмл могут быть такие поля ка терминал, если они все сольются в одно, группировка то идет по дате
 
 Top
phpself
Отправлено: 02 Сентября, 2010 - 12:01:48
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




duk пишет:
фраза
GROUP BY DATE_FORMAT(dtime, '%Y-%m-%d')";
смысла не имеет. Группировать надо по полю, которое получится в результате выборки, например GROUP BY dtime
А вообще не понятно, как в хтмл могут быть такие поля ка терминал, если они все сольются в одно, группировка то идет по дате


Терминал - это тип платежа который в базе как метод = 3, по этому платежу нужно вывести за день общую сумму пополнений и бонусов, так же в этот день нужно включить суммы других типов. Я смог сделать только общий итоговый вывод, который, подсчитывает все суммы и бонусы за день. А как "разбросать" суммы по методам в один день ..?

Уже второй день пытаюсь это реализовать. поиск уже реально надоел, поэтому решил спросить на форуме.

(Отредактировано автором: 02 Сентября, 2010 - 12:04:30)

 
 Top
duk
Отправлено: 02 Сентября, 2010 - 12:08:44
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Февр. 2010  
Откуда: Москва


Помог: 3 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT dtime, SUM(amount), SUM(bonus), method
  3. FROM fn.fn_balance_in
  4. WHERE TO_DAYS('2010-07-01') - TO_DAYS(dtime) <= 30
  5. GROUP BY dtime, method";
  6.  


этот код получит статистику по платежам с разбивкой по дате и методу
 
 Top
phpself
Отправлено: 02 Сентября, 2010 - 12:14:26
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




duk пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT dtime, SUM(amount), SUM(bonus), method
  3. FROM fn.fn_balance_in
  4. WHERE TO_DAYS('2010-07-01') - TO_DAYS(dtime) <= 30
  5. GROUP BY dtime, method";
  6.  


этот код получит статистику по платежам с разбивкой по дате и методу


спасибо, уже лучше, но к сожалению не совсем то. Видимо дальше нужно заниматься обработкой в пыхе...
(Добавление)
Больше мыслей нет как это можно сделать ? +)) прошу помощи
 
 Top
duk
Отправлено: 02 Сентября, 2010 - 12:59:49
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Февр. 2010  
Откуда: Москва


Помог: 3 раз(а)




мыслей то полно, а вот что именно сделать - неясно
Просили по дням и методу - пжлста.
 
 Top
phpself
Отправлено: 02 Сентября, 2010 - 13:09:50
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




duk пишет:
мыслей то полно, а вот что именно сделать - неясно
Просили по дням и методу - пжлста.


в том запросе который вы написали получается вывод:

2010-07-19 19:21:02 78.00 18.00
2010-07-20 10:59:55 66.00 14.00
2010-07-27 14:03:00 10.00 2.00
2010-07-28 13:30:57 12.00 4.00
2010-07-28 13:30:57 11.00 5.00
2010-07-28 13:30:57 11.00 3.00
2010-07-29 13:30:57 16.00 6.00

дак вот как сделать так что бы

вместо
2010-07-28 13:30:57 12.00 4.00
2010-07-28 13:30:57 11.00 5.00
2010-07-28 13:30:57 11.00 3.00

было
2010-07-28 12,00|4.00 --- 11.00|5.00 --- 11.00|3.00

ваш запрос, который выше, почти подходит, за исключением повтора даты в разном методе.

уже много чего перепробовал. возможно из за того что голова забита этой проблемой, она не хочет думать =) Как говорится одна голова - хорошо, а две лучше =)
 
 Top
duk
Отправлено: 02 Сентября, 2010 - 13:36:03
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Февр. 2010  
Откуда: Москва


Помог: 3 раз(а)




Кажется понял

PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT dtime, SUM(if(metod=1,amount,0)) as am_met_1, SUM(if(metod=1,bonus,0)) as bonus_met_1, SUM(if(metod=2,amount,0)) as am_met_2, SUM(if(metod=2,bonus,0)) as bonus_met_2
  3. FROM fn.fn_balance_in
  4. WHERE TO_DAYS('2010-07-01') - TO_DAYS(dtime) <= 30
  5. GROUP BY dtime";
  6.  


ну и так далее
 
 Top
phpself
Отправлено: 02 Сентября, 2010 - 13:54:15
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




duk пишет:
Кажется понял

PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT dtime, SUM(if(metod=1,amount,0)) as am_met_1, SUM(if(metod=1,bonus,0)) as bonus_met_1, SUM(if(metod=2,amount,0)) as am_met_2, SUM(if(metod=2,bonus,0)) as bonus_met_2
  3. FROM fn.fn_balance_in
  4. WHERE TO_DAYS('2010-07-01') - TO_DAYS(dtime) <= 30
  5. GROUP BY dtime";
  6.  


ну и так далее


скорей всего подошло =) нужно углубляться в сиквел =)

Все хорошо, то что нужно. Спасибо большое!!!

(Отредактировано автором: 02 Сентября, 2010 - 15:46:57)

 
 Top
phpself
Отправлено: 02 Сентября, 2010 - 16:47:46
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




Задача усложнилась, чем ввели меня в ступор. Допустим в примере выше мы выбирали показывать данные за месяц с группировкой по дню. С 1-го по 19 и т.д. число дат нет потому что не было транзакций, как сделать так, что бы недостающие даты добавлялись с нулями ?
 
 Top
JustUserR
Отправлено: 02 Сентября, 2010 - 17:44:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




phpself пишет:
Как сделать так, что бы недостающие даты добавлялись с нулями ?
В большистве реализаций SQL имеется специальная функция которая позволяет осуществлять при выводе замену нулевых значений на заданее заданных объект определенного типа - это осуществляют функции типа IFNULL и ISNULL


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
phpself
Отправлено: 02 Сентября, 2010 - 23:18:46
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




раскопал ф-ю которая генерит по заданному диапазону даты
PHP:
скопировать код в буфер обмена
  1. function createDateRangeArray($strDateFrom, $strDateTo) {
  2.                     // takes two dates formatted as YYYY-MM-DD and creates an
  3.                     // inclusive array of the dates between the from and to dates.
  4.                     // could test validity of dates here but I'm already doing
  5.                     // that in the main script
  6.  
  7.                     $aryRange = array();
  8.  
  9.                     $iDateFrom = mktime(1, 0, 0, substr($strDateFrom, 5, 2), substr($strDateFrom, 8, 2), substr($strDateFrom, 0, 4));
  10.                     $iDateTo = mktime(1, 0, 0, substr($strDateTo, 5, 2), substr($strDateTo, 8, 2), substr($strDateTo, 0, 4));
  11.  
  12.                     if ($iDateTo >= $iDateFrom) {
  13.                         array_push($aryRange, date('Y-m-d', $iDateFrom)); // first entry
  14.  
  15.                         $i = 0;
  16.                         while ($iDateFrom < $iDateTo) {
  17.                             $iDateFrom+=86400; // add 24 hours
  18.                             array_push($aryRange, date('Y-m-d', $iDateFrom));
  19.                         }
  20.                     }
  21.                     return $aryRange;
  22.                 }


как можно подставить свои значения с запроса mySQL(запрос выше от duk) напротив дат с фу-ии сравнивая даты. Если существует дата в БД то ставить значения ежели нет идем дальше и ставим нули. помогите в этой реализации
 
 Top
phpself
Отправлено: 02 Сентября, 2010 - 23:22:24
Post Id


Новичок


Покинул форум
Сообщений всего: 19
Дата рег-ции: Апр. 2010  


Помог: 0 раз(а)




для наглядности имг

нужно что бы допустим при выборе диапазона 2010-07-01 по 2010-07-31 отобразилась не только информация с БД но и даты до, после и между данными БД только с нулями так как операций не было в это время
Прикреплено изображение (Нажмите для увеличения)
1.jpg

(Отредактировано автором: 02 Сентября, 2010 - 23:25:13)

 
 Top
duk
Отправлено: 03 Сентября, 2010 - 09:59:01
Post Id



Частый гость


Покинул форум
Сообщений всего: 208
Дата рег-ции: Февр. 2010  
Откуда: Москва


Помог: 3 раз(а)




вариантов видится три
1. создать отдельную таблицу с датами (365 записей), делать селект из 2 таблиц, с join
2. Изначально вставить в исходную таблицу (365*количество методов) пустых записей
3. Оставить все как есть и смотреть на отсутствие дат при выводе на страницу

я бы сделал третий
 
 Top
JustUserR
Отправлено: 03 Сентября, 2010 - 14:00:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




phpself пишет:
Нужно что бы допустим при выборе диапазона 2010-07-01 по 2010-07-31 отобразилась не только информация с БД но и даты до, после и между данными БД только с нулями так как операций не было в это время
Для того чтобы осуществить вывод нулевых значений в SQL-запросе можно использовать схемы с дополнительным вложенным запросом - в частности это может быть рефлексивное соединение таблицы или набор строковых констант для каждого дня года - в таком случае вы устанавливаете внешнее левое соединение по списку дат и получаете требуемые пустые значения


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB