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. bambr32 - 06 Октября, 2014 - 11:02:46 - перейти к сообщению
Есть таблица с закзами.

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

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

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

Возможно ли решить данную проблему одним (максимум двумя запросами)?
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):
скопировать код в буфер обмена
  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

По разным требованиям к производительности и распределения данных в таблице есть разные варианты более оптимальных решений.
7. bambr32 - 06 Октября, 2014 - 14:08:15 - перейти к сообщению
огромное спасибо! Думаю, это как раз то что нужно!

 

Powered by ExBB FM 1.0 RC1