我希望从 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/