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]   

> Без описания
bambr32
Отправлено: 06 Октября, 2014 - 11:02:46
Post Id


Новичок


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


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




Есть таблица с закзами.

Структура таблицы:

idzakaza | zakazali | statuszakaza | summa | datazakaza | IP |
1 | 1 | 2 | 123 | 2014-12-12 15:12:23 | 5.5.5.5 |
2 | 0 | 0 | 444 | 2014-12-12 16:12:23 | 5.5.5.6 |
3 | 1 | 2 | 555 | 2014-13-12 17:12:23 | 5.5.5.7 |
4 | 1 | 1 | 290 | 2014-13-12 18:12:23 | 5.5.5.8 |
5 | 0 | 0 | 870 | 2014-13-12 19:12:23 | 5.5.5.9 |

Если zakazali=0, то statuszakaza всегда=0 (дело до оформления заказа не дошло)
Если zakazali=1, то statuszakaza м.б. равен 1 (отказ), 2(в обработке), 3(обработан)

Задача отобразить в табличном виде данные о заказах с разбивкой по дням за выбранный период (WHERE datazakaza BETWEEN ......) в следующем объеме:

Дата | Уник.посетителей | Всего посетителей | всего заказов (кол-во) | отказ(кол-во) | в обработке (кол-во) | обработан (кол-во)| всего заказов (кол-во) | отказ(сумма) | в обработке (сумма) | обработан (сумма) |

Всего.посетителей - общее количество записей в выборке (включая записи, где zakazalo=0);
Уник.посетителей - кол-во записей с уникальными IP (включая записи, где zakazalo=0);
Остальные колонки только по тем записям, где zakazali=1

Через несколько запросов сделать возможно, но сильно нагружает сервер.
Через один запрос смог выбрать только количество Уник.посетителей, Всего посетителей и кол-во заказов. Суммы не получается...
Плюс смог выбрать только итоги (за весь период).

Возможно ли решить данную проблему одним (максимум двумя запросами)?
 
 Top
RickMan
Отправлено: 06 Октября, 2014 - 11:20:17
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


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




Ну если это так нагружает БД то не легче будет или кэшировать запросы, либо сделать 1 запрос всеголишь с условием where between ну а остальное сделать в php?
 
 Top
bambr32
Отправлено: 06 Октября, 2014 - 11:35:27
Post Id


Новичок


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


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




RickMan пишет:
Ну если это так нагружает БД то не легче будет или кэшировать запросы, либо сделать 1 запрос всеголишь с условием where between ну а остальное сделать в php?


я и хочу одним запросом, но не знаю как - в том-то и проблема.

Основная проблема в том, что не представляю, как за один запрос посчитать суммы (summa) сразу для нескольких вариантов:

- заказов у которых zakazali=1 и statuszakaza=1;
- заказов у которых zakazali=1 и statuszakaza=2;
- заказов у которых zakazali=1 и statuszakaza=3;

Через 3 запроса легко (Where statuszakaza=1 или 2 или 3)

А возможно ли сделать это в одном?
 
 Top
RickMan
Отправлено: 06 Октября, 2014 - 12:22:41
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


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




В 1 запросе подчитать сумму при раных WHERE как-то думаю нереально) И прочтите внимательно мое сообщение выше. Сделайте 1 запрос где условие выборки будет лишь время. А все остальные условия обработайте в php.
 
 Top
bambr32
Отправлено: 06 Октября, 2014 - 12:26:30
Post Id


Новичок


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


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




RickMan пишет:
В 1 запросе подчитать сумму при раных WHERE как-то думаю нереально) И прочтите внимательно мое сообщение выше. Сделайте 1 запрос где условие выборки будет лишь время. А все остальные условия обработайте в php.


Да, наверное так и придется, т.к. другие варианты слишком громоздкие.
Спасибо!
 
 Top
Мелкий Супермодератор
Отправлено: 06 Октября, 2014 - 12:38:17
Post Id



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


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


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




bambr32 пишет:
Дата | Уник.посетителей | Всего посетителей | всего заказов (кол-во) | отказ(кол-во) | в обработке (кол-во) | обработан (кол-во)| всего заказов (кол-во) | отказ(сумма) | в обработке (сумма) | обработан (сумма) |

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT date, count(DISTINCT ip), count(0),
  2. sum(zakazali=1),
  3. sum(zakazali=1 AND statuszakaza=1),
  4. sum(zakazali=1 AND statuszakaza=2),
  5. sum(zakazali=1 AND statuszakaza=3),
  6. sum(IF (zakazali=1 AND statuszakaza=1, summa, 0)),
  7. sum(IF (zakazali=1 AND statuszakaza=2, summa, 0)),
  8. sum(IF (zakazali=1 AND statuszakaza=3, summa, 0))
  9. FROM tablename
  10. WHERE /**/
  11. GROUP BY date

По разным требованиям к производительности и распределения данных в таблице есть разные варианты более оптимальных решений.


-----
PostgreSQL DBA
 
 Top
bambr32
Отправлено: 06 Октября, 2014 - 14:08:15
Post Id


Новичок


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


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




огромное спасибо! Думаю, это как раз то что нужно!
 
 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