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
Форумы портала PHP.SU :: Версия для печати :: Помогите решить задачу по выборке
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Помогите решить задачу по выборке

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

1. phpself - 02 Сентября, 2010 - 11:35:30 - перейти к сообщению
Добрый день. Задание состоит в том, что бы из базы выбрать все транзакции и отсортировать их по дням.

таблица БД:

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);
(Добавление)
что то мои таблицы, особенно вторую скосило...

сумма|бонус - к каждому методу платежа
2. duk - 02 Сентября, 2010 - 11:55:13 - перейти к сообщению
фраза
GROUP BY DATE_FORMAT(dtime, '%Y-%m-%d')";
смысла не имеет. Группировать надо по полю, которое получится в результате выборки, например GROUP BY dtime
А вообще не понятно, как в хтмл могут быть такие поля ка терминал, если они все сольются в одно, группировка то идет по дате
3. phpself - 02 Сентября, 2010 - 12:01:48 - перейти к сообщению
duk пишет:
фраза
GROUP BY DATE_FORMAT(dtime, '%Y-%m-%d')";
смысла не имеет. Группировать надо по полю, которое получится в результате выборки, например GROUP BY dtime
А вообще не понятно, как в хтмл могут быть такие поля ка терминал, если они все сольются в одно, группировка то идет по дате


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

Уже второй день пытаюсь это реализовать. поиск уже реально надоел, поэтому решил спросить на форуме.
4. duk - 02 Сентября, 2010 - 12:08:44 - перейти к сообщению
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.  


этот код получит статистику по платежам с разбивкой по дате и методу
5. phpself - 02 Сентября, 2010 - 12:14:26 - перейти к сообщению
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.  


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


спасибо, уже лучше, но к сожалению не совсем то. Видимо дальше нужно заниматься обработкой в пыхе...
(Добавление)
Больше мыслей нет как это можно сделать ? +)) прошу помощи
6. duk - 02 Сентября, 2010 - 12:59:49 - перейти к сообщению
мыслей то полно, а вот что именно сделать - неясно
Просили по дням и методу - пжлста.
7. phpself - 02 Сентября, 2010 - 13:09:50 - перейти к сообщению
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

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

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

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.  


ну и так далее
9. phpself - 02 Сентября, 2010 - 13:54:15 - перейти к сообщению
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.  


ну и так далее


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

Все хорошо, то что нужно. Спасибо большое!!!
10. phpself - 02 Сентября, 2010 - 16:47:46 - перейти к сообщению
Задача усложнилась, чем ввели меня в ступор. Допустим в примере выше мы выбирали показывать данные за месяц с группировкой по дню. С 1-го по 19 и т.д. число дат нет потому что не было транзакций, как сделать так, что бы недостающие даты добавлялись с нулями ?
11. JustUserR - 02 Сентября, 2010 - 17:44:59 - перейти к сообщению
phpself пишет:
Как сделать так, что бы недостающие даты добавлялись с нулями ?
В большистве реализаций SQL имеется специальная функция которая позволяет осуществлять при выводе замену нулевых значений на заданее заданных объект определенного типа - это осуществляют функции типа IFNULL и ISNULL
12. phpself - 02 Сентября, 2010 - 23:18:46 - перейти к сообщению
раскопал ф-ю которая генерит по заданному диапазону даты
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) напротив дат с фу-ии сравнивая даты. Если существует дата в БД то ставить значения ежели нет идем дальше и ставим нули. помогите в этой реализации
13. phpself - 02 Сентября, 2010 - 23:22:24 - перейти к сообщению
для наглядности имг

нужно что бы допустим при выборе диапазона 2010-07-01 по 2010-07-31 отобразилась не только информация с БД но и даты до, после и между данными БД только с нулями так как операций не было в это время
14. duk - 03 Сентября, 2010 - 09:59:01 - перейти к сообщению
вариантов видится три
1. создать отдельную таблицу с датами (365 записей), делать селект из 2 таблиц, с join
2. Изначально вставить в исходную таблицу (365*количество методов) пустых записей
3. Оставить все как есть и смотреть на отсутствие дат при выводе на страницу

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

 

Powered by ExBB FM 1.0 RC1