表 -
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中的查询以提取上述输出。
答案 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
)
有时尝试一些方法很有用,看看哪些方法最适合您的索引和应用程序的其他方面。欢呼声。