|
|
|
| Доброго времени суток.
Целый вечер ломаю голову вот над такой непростой для меня задачей.
Для модуля статистики я пишу интерфейс вывода отказов. Если кто не знает - это когда пользователь, зайдя на сайт, тут же его покидает, не переходя на какую-либо другую страницу. Технически это выглядит так: при клике РНР-скрипт фиксирует session_id() и заносит в базу. Таким образом, например, если пользователь прошел по 5 страницам, в базе будет 5 записей с одним и тем же значением столбца session_id. Соответственно, отказ - это сессия, состоящая всего лишь из одной строки в базе с уникальным session_id (т.е. юзер сунулся и быстренько свалил).
Так вот, мне нужно прописать бэкенд для этой базы: админ, зайдя в соответствующий раздел модуля статистики, должен видеть информацию по отказам построчно, например, так:
Отказы
IP 85.234.60.219 :: 07.10.2010 :: index.php
IP 85.101.35.12 :: 08.10.2010 :: about.php
и т.д.
Проблема в следующем. Я должен составить такой SQL-запрос, который выдергивал бы мне из базы только ТЕ СТРОКИ, где количество УНИКАЛЬНЫХ вхождений строки session_id равно ЕДИНИЦЕ! Вот как составить такое жирное условие WHERE - я уже всю голову сломал. COUNT и DISTINCT для WHERE вроде бы как не разрешены...
Есть громоздкий вариант - доставать ВСЕ данные из таблицы статистики, потом на стороне РНР группировать их по уникальным session_id (разбирать по массивам), для каждого массива подсчитывать количество элементов, и уже только из тех, где это количество =1, доставать конечные данные (айпи, время и тп). Меня же интересует, возможно ли организовать такое в рамках ОДНОГО sql-запроса, красиво и изящно???
Буду крайне благодарен за помощь и ваши советы. | |
|
|
|
|
|
|
|
для: Anwor
(07.10.2010 в 01:27)
| | distinct вам не нужен.
Нужен GROUP BY session_id
в фильтре WHERE функция COUNT конечно не разрешена, зато она вполне логична в фильтре HAVING | |
|
|
|
|
|
|
|
для: Trianon
(07.10.2010 в 10:26)
| | Trianon, огромное спасибо за наводку, все получилось при помощи запроса
SELECT * FROM stat_base GROUP BY session_id HAVING COUNT(id)=1 | |
|
|
|