Как определить первый экземпляр нескольких элементов в таблице - PullRequest
2 голосов
/ 08 февраля 2012

Заголовок не очень хорошо описывает это, но предполагает следующую упрощенную таблицу в базе данных Mysql 5:

 access

 access_id | ip        | date  | browser
 ---------------------------------------------  
 int       | char(40)  | date  | varchar(255)

как мне найти наиболее оптимальный способ определения количества пользователей, впервые использующих Интернет (путем ip игнорирования NAT-маршрутизации и нескольких людей, посещающих с одного IP-адреса) и их браузера, посещающего сайт в промежутке между датами. I.e.:

 SELECT count(browser), browser 
   FROM access 
 WHERE date > '2011-11-1' AND date < '2011-12-1' 
 AND ip NOT IN (SELECT ip FROM access WHERE date < '2011-11-1')
 GROUP BY browser 

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

1 Ответ

1 голос
/ 08 февраля 2012

Насколько я знаю, MySQL может делать это только с помощью коррелированного подзапроса или присоединения к подзапросу ...


Коррелированный-Sub-запрос:

SELECT
  count(browser), browser
FROM
  access
WHERE
      date = (SELECT MIN(date) FROM access AS lookup WHERE ip = access.ip)
  AND date > '2011-11-1'
  AND date < '2011-12-1' 
GROUP BY
  browser


Sub-запрос:

SELECT
  count(access.browser), access.browser
FROM
  (SELECT ip, MIN(date) AS date FROM access GROUP BY ip) AS lookup
INNER JOIN
  access
    ON  access.ip   = lookup.ip
    AND access.date = lookup.date
WHERE
      lookup.date > '2011-11-1'
  AND lookup.date < '2011-12-1' 
GROUP BY
  access.browser

В любом случае, просите индекс на (ip, date)

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