2010-11-20 7 views
0

は私が訪問テーブル(visit_table)、構造:MySQL - 別のクエリの結果をGROUP BYする方法は?

  • IDを
  • のIP_address
  • タイムスタンプ

とIPのための国の名前を持つテーブル(country_table)は範囲

  • ID
  • begin_IP( IP範囲)
  • end_IP(IP範囲の終わり)
  • begin_num(begin_IPの数値同等、すなわちINET_ATON(begin_IP))
  • END_NUM
  • COUNTRY_CODEの開始(例えばUS)
  • http://www.maxmind.com/app/csvに基づいて
  • COUNTRY_NAME
    ()

私は、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またはステートメントのBY SELECTまたはGROUPで何かをすることのいくつかの並べ替え?任意のポインタを歓迎します!

+0

を、私はあなたが副選択の形でGROUP BY句でselect文を書くことができると思います。それはOracle上で動作します。多分mysqlでも動作します。誰かがこれを確認できますか? – Falcon

答えて

1

はい、あなたは参加したい:

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 
3

用途:

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

c.country_codeによるグループの方が高速でしょうか? – Pentium10

+0

@ Pentium10:値を格納するために使用するバイト数が少ないデータ型でグループ化またはジョインすると、パフォーマンスが向上します。インデックスは考慮されるかもしれませんが、INSERT/UPDATE/DELETEクエリに悪影響を与えます... –

関連する問題