MySQL查询:如何为一列选择具有值子集的行?

MySQL查询:如何为一列选择具有值子集的行?,sql,mysql,Sql,Mysql,有两个表,一个是联系人表,一个是关系历史表。 联系人可以有几种类型的关系(业务关系、个人关系、志愿者关系等),这意味着随着时间的推移,他们可以在RelationshipHistory表中有几种引用。每个关系行都有一列,指示与该关系相关的事件。例如,联系人ID为123的联系人John Smith在RelationshipHistory表中可以有两行,如:123,个人,有趣的事件和123,志愿者,无聊的事件。我需要执行的查询是“获取所有与事件“有趣事件”和事件“无聊事件”相关的联系人” 我最初认为这

有两个表,一个是
联系人
表,一个是
关系历史
表。
联系人可以有几种类型的关系(业务关系、个人关系、志愿者关系等),这意味着随着时间的推移,他们可以在RelationshipHistory表中有几种引用。每个关系行都有一列,指示与该关系相关的事件。例如,联系人ID为123的联系人John Smith在RelationshipHistory表中可以有两行,如:123,个人,有趣的事件和123,志愿者,无聊的事件。我需要执行的查询是“获取所有与事件“有趣事件”和事件“无聊事件”相关的联系人”

我最初认为这样的查询是可行的:

SELECT DISTINCT LastName, FirstName 
  FROM Contacts 
  JOIN RelationshipHistory ON RelationshipHistory.ContactKey = Contacts.ContactGUID 
 WHERE RelationshipHistory.Event = 'Fun Event' 
   AND RelationshipHistory.Event = 'Boring Event'
但是它不会返回任何结果。当我再次查看查询时,我意识到这是不可能的,因为比较是在行上进行的,并且列中的一个值同时等于两个不同的值是没有意义的

这个查询看起来很简单,但更仔细地看,我不知道如何在一个列中找到两个或更多值的匹配值的行

是否有某种方法可以使用内部选择或联接,或者必须将结果转储到临时表中…?

使用:

  SELECT LastName, FirstName 
    FROM Contacts c
    JOIN RelationshipHistory re ON re.ContactKey = c.ContactGUID 
                               AND re.Event IN ('Fun Event', 'Boring Event')
GROUP BY LastName, FirstName 
  HAVING COUNT(DISTINCT re.contactkey) = 2
您的查询不起作用,因为它要求
RELATIONSHIPHISTORY.contactkey
同时为两个值,这是不可能的。这意味着您需要使用
,或者使用
IN
子句,它是同一列上多个OR的简写。但是,IN子句不支持任何模式匹配方式-您需要需要使用全文搜索(FTS)功能

此查询的另一部分是
HAVING
子句-它统计不同的
contactkey
值,因为如果它们不不同,“趣味事件”的重复项将是误报


要使查询正常工作,IN子句的数量必须与正在计数的不同值的数量相匹配。因此,如果要查找三个或五个事件,则需要更新HAVING子句。

如果需要与有趣事件和无聊事件都有关系的联系人:

SELECT DISTINCT LastName, FirstName FROM Contacts JOIN RelationshipHistory AS BoringEvent ON Boring.ContactKey = Contacts.ContactGUID JOIN RelationshipHistory AS FunEvent ON Boring.ContactKey = Contacts.ContactGUID WHERE FunEvent.Event = 'Fun Event' AND BoringEvent.Event = 'Boring Event' 选择不同的LastName、FirstName 来自联系人 将RelationshipHistory连接为BoringEvent ON.ContactKey=Contacts.ContactGUID JOIN RelationshipHistory AS FunEvent ON.ContactKey=Contacts.ContactGUID 其中FunEvent.Event='Fun Event' 和BoringEvent.Event='无聊事件'
我们在同一张桌子上做了两个连接。

+1天哪,但你真的在用“有趣”和“无聊”的事件关联来理解他;)…如果他的意图至少是这两个关联,那么限制这两个关联可能会有点混乱。想一想他是否需要放松限制不是一件坏事。顺便说一句-你有什么理由投这个球吗进入ON子句,而不是进入WHERE?@Tahbaza:ON
子句中的附加内容实际上只对外部联接重要,但我尝试保持一致。对于外部联接,in子句将在联接之前应用-就像派生表/内联视图一样。感谢您的帮助,我不知道是否可以自己解决这个问题。是的,可以有两个以上的事件。现在最多可以指定三个,但没有理由将来不能有更多。