Есть таблица с закзами.
Структура таблицы:
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
Через несколько запросов сделать возможно, но сильно нагружает сервер.
Через один запрос смог выбрать только количество Уник.посетителей, Всего посетителей и кол-во заказов. Суммы не получается...
Плюс смог выбрать только итоги (за весь период).
Возможно ли решить данную проблему одним (максимум двумя запросами)?
1. bambr32 - 06 Октября, 2014 - 11:02:46 - перейти к сообщению
2. RickMan - 06 Октября, 2014 - 11:20:17 - перейти к сообщению
Ну если это так нагружает БД то не легче будет или кэшировать запросы, либо сделать 1 запрос всеголишь с условием where between ну а остальное сделать в php?
3. bambr32 - 06 Октября, 2014 - 11:35:27 - перейти к сообщению
RickMan пишет:
Ну если это так нагружает БД то не легче будет или кэшировать запросы, либо сделать 1 запрос всеголишь с условием where between ну а остальное сделать в php?
я и хочу одним запросом, но не знаю как - в том-то и проблема.
Основная проблема в том, что не представляю, как за один запрос посчитать суммы (summa) сразу для нескольких вариантов:
- заказов у которых zakazali=1 и statuszakaza=1;
- заказов у которых zakazali=1 и statuszakaza=2;
- заказов у которых zakazali=1 и statuszakaza=3;
Через 3 запроса легко (Where statuszakaza=1 или 2 или 3)
А возможно ли сделать это в одном?
4. RickMan - 06 Октября, 2014 - 12:22:41 - перейти к сообщению
В 1 запросе подчитать сумму при раных WHERE как-то думаю нереально) И прочтите внимательно мое сообщение выше. Сделайте 1 запрос где условие выборки будет лишь время. А все остальные условия обработайте в php.
5. bambr32 - 06 Октября, 2014 - 12:26:30 - перейти к сообщению
RickMan пишет:
В 1 запросе подчитать сумму при раных WHERE как-то думаю нереально) И прочтите внимательно мое сообщение выше. Сделайте 1 запрос где условие выборки будет лишь время. А все остальные условия обработайте в php.
Да, наверное так и придется, т.к. другие варианты слишком громоздкие.
Спасибо!
6. Мелкий - 06 Октября, 2014 - 12:38:17 - перейти к сообщению
bambr32 пишет:
Дата | Уник.посетителей | Всего посетителей | всего заказов (кол-во) | отказ(кол-во) | в обработке (кол-во) | обработан (кол-во)| всего заказов (кол-во) | отказ(сумма) | в обработке (сумма) | обработан (сумма) |
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- SELECT date, count(DISTINCT ip), count(0),
- sum(zakazali=1),
- sum(zakazali=1 AND statuszakaza=1),
- sum(zakazali=1 AND statuszakaza=2),
- sum(zakazali=1 AND statuszakaza=3),
- sum(IF (zakazali=1 AND statuszakaza=1, summa, 0)),
- sum(IF (zakazali=1 AND statuszakaza=2, summa, 0)),
- sum(IF (zakazali=1 AND statuszakaza=3, summa, 0))
- FROM tablename
- WHERE /**/
- GROUP BY date
По разным требованиям к производительности и распределения данных в таблице есть разные варианты более оптимальных решений.