MySQL - как GROUP BY на результат другого запроса? - PullRequest
0 голосов
/ 21 ноября 2010

У меня есть таблица посещений (visit_table), структура:

  • ID
  • IP_адрес
  • отметка времени

и таблица(country_table) с именами стран для диапазонов IP

  • ID
  • begin_IP (начало диапазона IP)
  • end_IP (конец диапазона IP)
  • begin_num (числовой эквивалент begin_IP, т.е. INET_ATON (begin_IP)) *
  • end_num
  • код страны (например, США)
  • название страны
    (на основе http://www.maxmind.com/app/csv)

Я использую MySQL 5.0.67 и хотел бы написать запрос, чтобы получить количество посещений по стране, что-то вроде:

  SELECT country.table.country_name, 
         count(distinct visit_table.IP_address)  
    FROM country_table, visit_table  
   WHERE country_name = (SELECT country_name  
                           FROM country_table  
                          WHERE INET_ATON(visits.IP_address) >= begin_num  
                            AND INET_ATON( visits.IP_Address) <= end_num  
                          LIMIT 0,1 )  
GROUP BY country_table.country_name  

Я почти уверен, что делаю что-то не так, но не знаю, как это исправить - что-то вроде JOIN или что-то с оператором SELECT или GROUP BY?Любые указатели приветствуются!

Ответы [ 2 ]

3 голосов
/ 21 ноября 2010

Использование:

  SELECT c.country_name, 
         COUNT(DISTINCT v.IP_address)  
    FROM COUNTRY_TABLE c
    JOIN VISIT_TABLE v ON v.country_name = c.country_name
   WHERE INET_ATON(v.IP_Address) BETWEEN begin_num AND end_num  
GROUP BY c.country_name

Если для этого диапазона IP-адресов нет страны, вы ничего не получите.Но если из диапазона возвращено более одной страны, запрос должен быть обновлен, чтобы обработать его.

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

   SELECT c.country_name, 
          COUNT(DISTINCT v.IP_address)  
     FROM COUNTRY_TABLE c
LEFT JOIN VISIT_TABLE v ON v.country_name = c.country_name
    WHERE INET_ATON(v.IP_Address) BETWEEN begin_num AND end_num  
 GROUP BY c.country_name
1 голос
/ 21 ноября 2010

Да, вы хотите присоединиться:

SELECT country_table.country_name, count(distinct visit_table.IP_address)  
FROM country_table
RIGHT JOIN visit_table ON visit_table.id=country_table.id       
GROUP BY country_table.country_name  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...