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

Mysql 选择列对,其中一个列至少出现在两个不同的列对中,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

我希望从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   |
+----+---------+----------+-----------+
我希望选择至少两台计算机中存在特定IP地址的所有行。只需要一个机器IP地址对,因此结果将是:

+---------+-----------+
| machine | ipaddress |
+---------+-----------+
| X       | 2.3.4.5   |
| Y       | 2.3.4.5   |
| Z       | 2.3.4.5   |
+---------+-----------+
我已尝试在计算机和IP地址上分组:

从表中选择计算机、IP地址 按计算机分组,IP地址的计数*>1 然而,这导致X、1.2.3.4也被包括在内

我还尝试使用子查询,但这只返回一次ipaddress:

从中选择计算机、IP地址 按机器从表组中选择机器,ipaddress,ipaddress t 按计数大于1的IP地址分组 我很难找到一个合适的查询。需要注意的是,该表相当大,需要一个高效的查询。

试试这个:

  SELECT machine, ipaddress FROM 
        (SELECT DISTINCT machine, ipaddress FROM table) t 
    GROUP BY ipaddress,machine 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   |
+---------+-----------+
如果性能测试对您很重要,这种替代语法也可以工作,并且可能更快,也可能不会更快:

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

这将返回一个空集,因为它只查找一次所有计算机、IP地址对,因此计数*始终正好为1。