выборка по дате с разницей в 10 мин

clevel

Новичок
Где можно ПОДРОБНО почитать об этом? я слабо представляю эту конструкцию...

подумаешь маленько сам, внесёшь пару-тройку лишних строчек в запрос, и получишь своё решение
я уже сутки думаю... ну никак.... хотя себя совсем тупым не считаю....
просто мускул не поддерживает возможности оперировать предыдущим и ли последующим элементом - только текущий... а мне надо сравнивать предыдущий с текущим... вот и голову ломаю...
если делать вывод в пхп данных и средствами пхп в цикле проверять, то очень долго будет выполняться запрос...
 

su1d

Старожил PHPClubа
в t3 что у тебя? промежуточные записи между двумя рассматриваемыми (одна в t1, другая в t2).

определение соседних записей какое? верно: те, между которыми НЕТ никаких других.
в WHERE делаем отрицание, и в итоге получаем лишь соседние записи, разница в посещении которых более 600.

добавь в список полей COUNT(t1.page) AS page_count, добавь ORDER BY page_count, добавь GROUP BY t1.page, добавь в джойны линковку по юзеру... это - то, что тебе надо?
 

clevel

Новичок
добавь в список полей COUNT(t1.page) AS page_count, добавь ORDER BY page_count, добавь GROUP BY t1.page, добавь в джойны линковку по юзеру...
1.тяжело разобраться с left join
2. что такое линковка?
я наверное с ума уже схожу от безисходности... хелп плз..!!!

алгоритм был заложен таков:
1.вычленяем уникальных юзеров, например, 1,2,3.
2.для каждого из юзеров находим разрывы более 10 мин в поле when и узнаем page этих разрывов
3.подсчитываем кол-во повторов page для всех юзеров вместе.
4.выводим 10 page с максимальным кол-вом повторов
Как я планировал, GROUP BY user Order by count(page)
это еще и хотелось сделать одним запросом.
результат должен быть: page count(page)
 

su1d

Старожил PHPClubа
на mysql.com уже доки не лежат что ли?

LEFT JOIN - это тот же самый INNER JOIN, который ты обычно используешь в виде запятой между именами таблиц в запросе (синтаксически INNER JOIN и "," - одно и то же), но с той лишь разницей, что INNER JOIN тебе добавит только соответствующие условию записи, а LEFT JOIN - добавит все записи, но там, где условие не будет выполняться, поля примут значение NULL.

SELECT
COUNT(t1.page) AS page_count, t1.user AS user1, t1.page AS page1, t1.hit AS hit1
FROM pages t1
LEFT JOIN pages t2 ON t2.user = t1.user AND t2.page = t1.page AND t1.hit - t2.hit > 600
LEFT JOIN pages t3 ON t3.user = t1.user AND t3.page = t1.page AND t3.hit > t2.hit AND t3.hit < t1.hit
WHERE t3.hit IS NULL
GROUP BY t1.page
ORDER BY page_count DESC

прежде, чем кидаться что-то кодить, проанализируй этот запрос.. разберись в нём полностью.. пойми что значит каждое слово...
 

clevel

Новичок
этот запрос у меня надолго задумался....
пытаюсь вникнуть в суть:
1.left join pages t2 и t3 есть виртуальное объединение-выборка столбцов user,page,hit из таблицы pages
2. в t2 держим hits, которые больше на 600 аналогичных ячеек в pages.
3.не понятна роль t3
я подредактировал прошлое сообщение, там постарался предельно ясно изложить алгоритм, что хотел получить в результате....
 

clevel

Новичок
Да, при поиске разрыва в 10 мин не обязательно page должны совпадать... юзер мог уйти с одной страницы, а вернуться на совсем другую через 10 мин
Потом, не совсем понятна запись t2.hit-t1.hit>600. К примеру, первой записи из t1 соответствуют записи t2 начиная с 5, далее второму элементу с t1 соответствуют записи t2 начиная с 7.. а что будеи иметь в результате?
 

clevel

Новичок
Сделал такой запрос:
SELECT
COUNT(t1.page) AS page_count,
t1.user AS user1,
t1.page AS page1
FROM pages t1
LEFT JOIN pages t2 ON t2.user = t1.user
AND t1.hit - t2.hit > 600
LEFT JOIN pages t3 ON t3.user = t1.user
AND t3.hit > t2.hit AND t3.hit < t1.hit
WHERE t3.hit IS NULL
AND t2.hit IS NOT NULL
GROUP BY t1.user,t1.page
ORDER BY t1.user

выдает page_count user1 page1.
Вопрос: а как мне проссуммировать apge_count по page1 уникальным в том же запросе и выдавать не все эти записи page_count user1 page1, а только кол-во запросов и номера страниц?
 
Сверху