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子句将在联接之前应用-就像派生表/内联视图一样。感谢您的帮助,我不知道是否可以自己解决这个问题。是的,可以有两个以上的事件。现在最多可以指定三个,但没有理由将来不能有更多。