我有一张用于映射用户和功能的表格。基本上为每个用户启用了哪些功能。该表是| userId | featureId |与一个(用户)到多个(特征)关系。
我想创建一个带有userIds列表的查询,并返回缺少特定功能的userId列表。
含义我需要确保每个id都有一个特定的featureId。
userId featureId
1 A
1 B
2 A
3 C
4 D
3 A
所以在这个例子中,我将获得id(1,2,3,4)和featureId A的列表,并且查询将返回userId 4的一行,因为它是唯一的userId启用功能A.
答案 0 :(得分:1)
我想我可能已经回答了另一个问题:这不能解决您的数据;但我不确定你是如何确定它是你想要返回的用户4。因为每个用户都缺少其他用户的一些功能。也许我们只需要为您的示例中的特定功能(A)添加以下where子句?
根据集合来考虑数据
你需要
然后你需要
一种方法:这基本上表示返回功能列表中存在但尚未与用户关联的每个用户的功能。
SELECT U.userID, F.FeatureID as FeatureIDMissing
FROM USER U
CROSS JOIN FEATURE F
LEFT JOIN UserFeature UF
on U.UserID = UF.UserID
and F.FeatureID = UF.FeatureID
WHERE UF.UserID is null
-- and F.FeatureID = 'A' --maybe add this?
替代方法:(通过简单地排除用户已经存在的那些特征,结合两个步骤(2,3)。
在英语中,这表示,返回用户尚未关联的每个用户的所有功能
SELECT U.userID, F.FeatureID as FeatureIDMissing
FROM USER U
CROSS JOIN FEATURE F
WHERE not exists (SELECT *
FROM userFeature UF
WHERE U.UserID = UF.UserID
and F.FeatureID = UF.FeatureID)
--and F.FeatureID = 'A' --maybe add this?
任何一个答案都应该返回相同的结果。这是一个偏好数据库和性能问题。查看执行计划,以帮助确定哪个最适合您和您的数据。
现在,您可能意味着要为所有这些用户提供要为其生成一组唯一功能的用户ID列表,然后返回没有这些功能的用户。如果是这样而不是交叉联接功能,您只需使用(Select distinct FeatureID from userFeatures where UserID IN ('yourListHere')
这将为这些用户生成一组独特的功能,并确定哪些用户缺少与该组用户共享的某些功能。
因此...
SELECT U.userID, F.FeatureID as FeatureIDMissing
FROM USER U
CROSS JOIN (SELECT distinct FeatureID
FROM userFeatures
WHERE UserID IN ('yourListHere')F
LEFT JOIN UserFeature UF
on U.UserID = UF.UserID
and F.FeatureID = UF.FeatureID
WHERE UF.UserID is null
-- and F.FeatureID = 'A' --maybe add this?
作为一个例子。
答案 1 :(得分:1)
要查找没有功能X的用户列表,我会将其加入到具有该功能的用户列表中,并返回不在那里的用户。像这样:
SELECT *
FROM table_you_did_not_name as base
LEFT JOIN (
SELECT DISTINCT userID
FROM table_you_did_not_name
WHERE feature = 'X'
) as sub ON base.userID = sub.userID
WHERE sub.userID is null