mysql-find行的源ID只有一个dest ID

时间:2018-08-23 01:52:50

标签: mysql sql

transferHistory表:

╔════════════╦════════╗
║ sourceId   ║ destId ║
╠════════════╬════════╣
║       221  ║ 1      ║
║      2223  ║ 1      ║
║      2223  ║ 2      ║
║        44  ║ 3      ║
║        33  ║ 3      ║
║        55  ║ 3      ║
║        44  ║ 2      ║
╚════════════╩════════╝

因此,我想查找destId是给定ID且给定ID是源ID的唯一目标ID的所有行。

示例:

鉴于dest id = 1,结果应为221(因为源2223被划分为两个目的地1和2)

鉴于dest id = 2,结果应为空(因为源2223和44都划分为两个目标)

鉴于dest id = 3,结果应为33和55。

如何编写SQL来获取它?

2 个答案:

答案 0 :(得分:1)

您只想要没有其他目标ID的源ID。这表明not exists

select t.*
from t
where t.destId = @destId and
      not exists (select 1
                  from t t2
                  where t2.sourceId = t.sourceId and
                        t2.dest_id <> t.dest_id
                 );

如果希望所有符合条件的行,可以删除t.destId = @destId

答案 1 :(得分:1)

我认为您可以只查找只有一个目的地的sourceId,即

SELECT sourceId, destId
FROM transferHistory t
GROUP BY sourceId
HAVING COUNT(sourceId) = 1

输出:

sourceId    destId
33          3
55          3
221         1

如果只想为特定的destId获取它们,请将其添加到HAVING子句中:

SELECT sourceId, destId
FROM transferHistory t
GROUP BY sourceId
HAVING COUNT(sourceId) = 1 AND destID = 3

输出:

sourceId    destId
33          3
55          3