2011-01-31 2 views
0

Не знаете, как лучше всего это сказать, поэтому, пожалуйста, несите меня. Моя таблица (упрощенный) выглядит следующим образом:mySQL выбирает строки из одной таблицы для каждого user_id, близкие по метке времени

  • id - Integer - автоматическое приращение
  • user_id - Integer
  • timestamp - DATETIME

Что мне нужно, это возможность запросить эту таблицу и выберите все записи, где столбцы timestamp находятся в пределах предопределенного временного диапазона (потенциально произвольный, но позволяет говорить 10 минут) для каждого user_id. Так, например, я хотел бы знать, есть ли запись для гипотезы hetical user_id 5 на «2011-01-29 03:00:00», а затем на «2011-01-29 03:02:00», но нет, если пользователь искал один раз на «2011-01-29 03:00: 00 », а затем в« 2011-01-29 05:00:00 ». Это также потребовало бы захвата случаев, когда пользователь будет искать более двух раз, каждый в пределах временного диапазона предыдущего.

Для фона это таблица поиска по сайту, и я хотел бы знать все экземпляры, в которых пользователь что-то ищет, а затем снова ищет (по-видимому, потому, что их предыдущий поиск не обеспечивал ожидаемых результатов).

Я знаю, что это, вероятно, проще, чем я это делаю, но я не могу понять это. При необходимости я могу уточнить или предоставить дополнительную информацию. Благодаря!

EDIT: Я заинтересован в поиске возвращающей результаты для всех пользователей в таблице, а не только пользователь # 5, а также для поиска без ввода фактического времени. Временная метка не должна быть чем-то, что вводится вручную, но вместо этого должно находить строки каждому пользователю, находящимся в пределах 10 минут друг от друга.

ответ

1
SELECT distinct t1.user_id, t1.another_field, t1.another_field 
FROM 
    table t1, 
    table t2 
WHERE 
t1.user_id = t2.user_id 
AND abs(timestampdiff(MINUTE, t1.timestamp, t2.timestamp)) < 10 

если вы хотите еще больше ограничить результаты, вы можете добавить

AND t1.user_id = any_number (or IN or between, etc) 

Чтобы ограничить диапазон дат добавить,

AND t1.timestamp BETWEEN A and B (or > or <) 
+0

Это было очень полезно, однако для предотвращения совпадения в той же строке мне нужно было добавить 'AND t1.id! = T2.id 'к запросу. Благодаря! – William

1

Это должно дать вам всем пользователь и ихнее количество поисковых запросов в течение срока:

SELECT user_id, COUNT(*) AS cnt FROM table 
    WHERE timestamp BETWEEN "2011-01-29 03:00:00" AND "2011-01-29 03:02:00" 
    GROUP BY user_id 
    ORDER BY user_id 

Это покажет вам количество поисковых запросов, просто user_id #5:

SELECT COUNT(*) AS cnt FROM table 
    WHERE user_id=5 
    AND timestamp BETWEEN "2011-01-29 03:00:00" AND "2011-01-29 03:02:00" 

В зависимости от фактического Д.Б. синтаксис может быть несколько иным, особенно формат дат, переданных в состояние BETWEEN.

+0

Спасибо, однако я использовал user_id 5 как гипотетический. Меня интересует поиск результатов поиска для всех пользователей в таблице, а также поиск без ввода времени ввода. Временная метка не должна быть чем-то, что вручную выполняется, но вместо этого должно динамически находить строки каждым пользователем, находящимся в пределах 10 минут друг от друга. Я обновлю оригинальный вопрос, чтобы отразить это. – William

+0

1) Я думаю, что вы все равно будете анализировать некоторое временное окно. 2) Вероятно, я бы добавил, добавив MIN (timestamp), MAX (timestamp) к первому запросу, который я написал, а затем подзаголовок для каждого пользователя.3) Попытайтесь исследовать встроенные функции даты MySql, я не настолько силен с mysql, извините – PeS

Смежные вопросы