2012-01-06 2 views
1

У меня есть запрос на запрос объявлений с несколькими примерами моих собственных.MySQL - Поиск первого реферера пользователя

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

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

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

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

+0

Вы имеете в виду _first_ по дате или попадание? –

ответ

1

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

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` 
; 
+0

Спасибо! Кажется, это работает. – Tim

+0

Рад, что это помогло –

1

Если у вас нет поля 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 предназначен для удаления дубликатов в конечном наборе результатов.

+0

Должен был уточнить - у меня есть уникальное поле 'id'. – Tim

+0

Я ищу что-то, что работает, не выбирая конкретного пользователя - он должен возвращать один реферер для каждого пользователя, и этот реферер должен быть единственным с наименьшим значением даты (или id). – Tim

+0

Тогда второй [отредактированный] запрос должен работать для вас. Внутренний запрос доставит вам hit_id из записей, которые представляют собой первый хит каждого пользователя, внешний запрос будет объединен с этим, чтобы получить реферер для первого удара каждого пользователя. Мне было бы интересно узнать, как производительность сравнивается между этим и идеей TEMP TABLE. – Umbrella

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