0

誰でも見つける方法を知っていますか? 私は3列を持っています

1-ID

2 - ユーザー名

3-IP

サンプルデータは次のとおりです。

+----+-----------+----------------+
| id | username  |    ip          |
+----+-----------+----------------+
|  1 | John      |  127.0.0.1     | 
|  2 | John      |  127.0.0.1     | 
|  3 | John      |  127.0.0.1     | 
|  4 | John      |  127.0.0.1     | 
|  5 | John      |  127.0.0.1     | 
|  6 | John      |  127.0.0.2     | 
|  7 | John      |  127.0.0.2     | 
|  8 | John      |  127.0.0.3     | 
|  9 | John      |  127.0.0.1     | 
| 10 | John      |  127.0.0.1     | 
| 11 | John      |  127.0.0.1     | 
| 12 | Pit       |  127.1.1.1     | 
| 13 | Pit       |  127.1.1.1     | 
| 14 | Pit       |  127.1.1.1     | 
| 15 | Pit       |  127.1.1.1     | 
| 16 | Pit       |  127.1.1.1     | 
| 17 | Pit       |  127.1.1.1     | 
+----+-----------+----------------+

したがって、値のいずれかが重複している ip を見つけたい場合は、一意の値を見つけたいので、このクエリで見つけることができます。

SELECT distinct `username`, `ip` FROM `logs`

今、クエリの結果は

+----+-----------+----------------+
| id | username  |    ip          |
+----+-----------+----------------+
|  1 | John      |  127.0.0.1     | 
|  7 | John      |  127.0.0.2     | 
|  8 | John      |  127.0.0.3     | 
| 12 | Pit       |  127.1.1.1     | 
+----+-----------+----------------+

それは良いですが、私が本当に欲しいものは何ですか?私はユーザー名のいずれかが重複したIPを持っていることを見つけたいので、結果は次のようにする必要があります:

+----+-----------+----------------+
| id | username  |    ip          |
+----+-----------+----------------+
|  1 | John      |  127.0.0.1     | 
|  7 | John      |  127.0.0.2     | 
|  8 | John      |  127.0.0.3     | 
+----+-----------+----------------+

ピットには重複したIPがないため、結果からピットを削除するにはどうすればよいですか?

4

4 に答える 4

1

以下を試してください -

SELECT `logs`.`username`, `logs`.`ip`
FROM (
    SELECT `username`
    FROM `logs`
    GROUP BY `username`
    HAVING COUNT(DISTINCT `ip`) > 1
) AS `dups`
INNER JOIN `logs`
    ON `dups`.`username` = `logs`.`username`
GROUP BY `logs`.`username`, `logs`.`ip`;

UPDATEユーザー名とIPにインデックスを追加すると、データセットが大きくなるにつれて、このクエリのパフォーマンスに大きな違いが生じます-

CREATE INDEX `IX_username_ip` ON `logs` (`username`, `ip`);
于 2012-04-04T13:34:59.287 に答える
0

これを試して

SELECT l1.username, l1.ip FROM logs l1
INNER JOIN logs l2
    ON l2.username = l1.username
    AND l2.ip != l1.ip
GROUP BY l1.username, l1.ip
于 2012-04-04T13:38:43.820 に答える
0
SELECT distinct `username`, `ip` 
FROM `logs`
WHERE `username` 
  IN (SELECT `username`
      FROM `logs`
      GROUP BY `username`
      HAVING COUNT(*) >1)
于 2012-04-04T13:36:14.730 に答える
-1
   select distinct username,group_concat( distinct ip ) ,count(distinct ip) as cnt from table_name group by username  having cnt>1;
于 2012-04-04T13:38:11.180 に答える