5

ユーザー名と IP を含むテーブルがあります。
同様の IP を持つユーザーのリストを取得する必要があります -最後の 3 桁または 2 桁または 1 桁を無視してください-

例: 190.200.210.180190.200.210.60を同じ IP として
カウントします。205.50.4.30205.50.4.197を同じ IP として カウントします。

IP のフィールド タイプは varchar として設定されており、これは現時点では変更できません。

現在私は使用しています:

SELECT GROUP_CONCAT( username ) names, IPs, COUNT( IPs ) AS Instances 
FROM users
GROUP BY IPs
HAVING (COUNT(IPs) >1)
ORDER BY  `Instances ` DESC 

同じIPを持つユーザーを取得します。 SQL ステートメントの出力

IP のフィールドを varchar として設定して、同様の IP を持つユーザーをグループ化する select ステートメントを作成することは可能ですか?

よろしくお願いいたします。

4

3 に答える 3

5

これを試して:

SELECT 
    GROUP_CONCAT(username) AS names, 
    SUBSTRING_INDEX(IPs, '.', 3) AS IPs
    COUNT(*) AS Instances 
FROM
    users
GROUP BY 
    SUBSTRING_INDEX(IPs, '.', 3)
HAVING
    COUNT(*) > 1
ORDER BY
    Instances DESC
于 2012-10-04T00:21:31.057 に答える
4

関数SUBSTR_INDEXを使用すると、IPアドレスの解析が簡単になります。

  SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(y.IPs,'.',1),'.',-1) a,
         SUBSTRING_INDEX(SUBSTRING_INDEX(y.IPs,'.',2),'.',-1) b,
         SUBSTRING_INDEX(SUBSTRING_INDEX(y.IPs,'.',3),'.',-1) c,
         SUBSTRING_INDEX(SUBSTRING_INDEX(y.IPs,'.',4),'.',-1) d
  FROM (SELECT ... FROM users) y

エイリアス化されたオクテットa、b、c、dをベースとして使用すると、同様のロジックを質問に適用して、必要なオクテットマッチングを実行できるはずです...

于 2012-10-04T00:14:06.343 に答える
2

個人的には、次のように最後の.nnn部分を削除します…</p>

SELECT
    GROUP_CONCAT(`username` SEPARATOR ', ') AS 'names',
    SUBSTRING(`IPs`,1,(CHAR_LENGTH(`IPs`)-CHAR_LENGTH(SUBSTRING_INDEX(`IPs`,'.',-1))-1)) AS 'roughIP',
    COUNT(*) AS 'Instances'
FROM `users`
GROUP BY `roughIP`
ORDER BY `Instances` DESC
于 2012-10-04T00:48:38.207 に答える