MySQL - поиск первого реферера пользователя - PullRequest
1 голос
/ 06 января 2012

У меня есть творческий запрос с несколькими собственными примерами.

У меня есть таблица, в которой регистрируются обращения пользователей со следующими полями:

  • id уникальныезначение для каждого зарегистрированного попадания
  • referrer текстовое значение URL
  • date целочисленное значение метки времени Unix
  • unique строка, уникально идентифицирующая пользователей (md5 изIP + соль, в основном)

(Обратите внимание, что я понимаю, что использование "unique" в качестве имени поля оказалось ужасным выбором при проектировании, но использование его в обратных галочках помогло избежать каких-либо проблем...)

Я бы хотел запрос, который возвращает список unique s и их первого реферера.

Ответы [ 2 ]

1 голос
/ 06 января 2012

Если вы ищете первого реферера по дате для каждого пользователя, вы можете сделать что-то вроде этого:

CREATE TEMPORARY TABLE tmp_hits
SELECT
  `unique`
, `date`
, `referrer`
FROM log_table
ORDER BY `date` ASC
;

SELECT
  `unique`
, `referrer`
FROM tmp_hits
GROUP BY `unique`
;
1 голос
/ 06 января 2012

Если у вас нет поля hit_id, вам придется использовать пару (unique, date) в качестве идентификатора строки. Вы должны быть в состоянии получить то, что вы ищете с чем-то вроде этого.

SELECT `referrer` FROM `hits` h1 INNER JOIN 
    (SELECT `unique`, MIN(`date`) FROM `hits` GROUP BY `unique`) h2
ON h1.`unique` = h2.`unique` AND h1.`date` = h2.`date`
GROUP BY `referrer`

Если у вас есть первичный ключ, который вы не упомянули, например hit_id, он становится немного короче и спасает вас от редкого случая, когда два попадания происходят от одного и того же пользователя в одну секунду:

SELECT `referrer` FROM `hits` h1 INNER JOIN 
    (SELECT MIN(`hit_id`) FROM `hits` GROUP BY `unique`) h2
ON h1.`hit_id` = h2.`hit_id`
GROUP BY `referrer`

В обоих случаях последняя функция GROUP BY - просто удалить дубликаты из вашего окончательного набора результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...