mysql - 选择其中一列出现在至少两个不同对中的列对

标签 mysql

我希望从 MySQL 表中选择一对不同的值,其中一列的值至少出现两次。

例如,我有下表:

+----+---------+----------+-----------+
| id | machine | filename | ipaddress |
+----+---------+----------+-----------+
| 1  | X       | /tmp/1   | 1.2.3.4   |
| 2  | X       | /tmp/2   | 1.2.3.4   |
| 3  | X       | /tmp/3   | 2.3.4.5   |
| 4  | Y       | /tmp/4   | 2.3.4.5   |
| 5  | Z       | /tmp/5   | 2.3.4.5   |
| 6  | Z       | /tmp/6   | 2.3.4.5   |
+----+---------+----------+-----------+

我希望选择至少两台机器中存在特定ipaddress的所有行。只需要一台机器-ipaddress对,因此结果将是:

+---------+-----------+
| machine | ipaddress |
+---------+-----------+
| X       | 2.3.4.5   |
| Y       | 2.3.4.5   |
| Z       | 2.3.4.5   |
+---------+-----------+

我尝试过对计算机和 IP 地址进行分组:

SELECT machine, ipaddress FROM table 
GROUP BY machine, ipaddress HAVING count(*) > 1

但是,这导致 (X, 1.2.3.4) 也被包含在内。

我还尝试使用子查询,但这只返回任何 ip 地址一次:

SELECT machine, ipaddress FROM 
    (SELECT machine, ipaddress FROM table GROUP BY machine, ipaddress) t 
GROUP BY ipaddress HAVING count(*) > 1

我无法找到正确的查询。需要注意的是,该表较大,对高效查询有一定的要求。

最佳答案

目前我面前没有 MySQL,但我在 SQL Server 中尝试了以下操作,它似乎可以解决您的问题。请务必编写一些单元测试来验证:

SELECT DISTINCT machine, ipaddress
FROM [table] t1
WHERE EXISTS (
 SELECT 1
   FROM [table] t2
  WHERE t1.ipaddress = t2.ipaddress
  GROUP BY ipaddress
 HAVING COUNT(DISTINCT machine) > 1);

这会产生您的数据:

+---------+-----------+
| machine | ipaddress |
+---------+-----------+
| X       | 2.3.4.5   |
| Y       | 2.3.4.5   |
| Z       | 2.3.4.5   |
+---------+-----------+

这种替代语法也适用,并且对于 MySQL 来说可能(或可能不会)更快(如果这对您很重要,请进行性能测试):

SELECT DISTINCT machine, ipaddress
FROM [table]
WHERE ipaddress IN (
 SELECT ipaddress
   FROM [table]
  GROUP BY ipaddress
 HAVING COUNT(DISTINCT machine) > 1);

关于mysql - 选择其中一列出现在至少两个不同对中的列对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21992472/

相关文章:

MySQL:mysqlimport 中缺少一些记录

mysql - 1324- mysql 中未定义的 CURSOR

mysql - 使用 min() 时返回 NULL 值

java - 如何使用 hibernate 和 MySQL 在 java 中创建单页应用程序 (SPA)

mysql - 如何在数据库中存储 5MB 文件预览

php - 获取路线的算法

PHP 自动将数据插入数据库的烦恼

php - MySQL GROUP BY 返回一行

mysql - UNION 具有不同列的两个表,没有重复项,并在 union 上更新一个字段

php - Silex 和 Doctrine mysql : how to return results from select all