MySQL查询到唯一的列组合

时间:2018-05-12 15:21:05

标签: mysql

表 -

TestID | IntegID
=======|======
P1     | In1
P2     | In2
P2     | In2
P3     | In3
P1     | In5
P1     | In5
P2     | In2
P3     | In3
P2     | In9

所需输出:

TestID | IntegID
=======|======
P1     | In1
P1     | In5
P2     | In2
P2     | In9

所以基本上我只想在第1列和第2列之间存在一对多关系的情况下提取行。

与P3类似,第2列只有1个对应的值,所以不应该提取它。但是,由于P1和P2在第2列中有多个值,因此提取了相关的行。

你可以帮我解决MySql中的查询以提取上述输出。

2 个答案:

答案 0 :(得分:2)

您可以在连接中使用带有count(不同的IntegId)的子查询

SELECT DISTINCT my_table.TestId, my_table.IntegId
FROM my_table 
INNER JOIN (
  SELECT TestID, COUNT(DISTINCT IntegID) 
  FROM my_table
  GROUP BY TestId 
  HAVING COUNT(DISTINCT IntegID) > 1
) T ON T.TestID = my_table.TestID 

答案 1 :(得分:0)

您可以将表连接到自身以获取不同的IntegID列,然后使用DISTINCT删除重复的行,如下所示:

SELECT DISTINCT t1.TestID, t1.IntegID
FROM my_table t1
JOIN my_table t2 ON t2.TestID = t1.TestID AND t2.IntegID != t1.IntegID;

我认为上述方法可能是最简单的,并且会为您提供最佳性能,但我喜欢上面使用COUNT(DISTINCT...的scaisEdge答案,所以这是使用IN的另一种方法并且只选择您需要的TestID行:

SELECT DISTINCT TestID, IntegID
FROM my_table
WHERE TestID IN
(
    SELECT TestID
    FROM my_table
    GROUP BY TestID
    HAVING COUNT(DISTINCT IntegID) > 1
)

有时尝试一些方法很有用,看看哪些方法最适合您的索引和应用程序的其他方面。欢呼声。

相关问题