我有以下查询:
select user_id from user_tags
where user_id = 3086533
输出:
基本上,我希望能够接受此查询,并且如果同时出现名称“master_sbx”和“phonePicked”,则将其更改为仅包含user_id。
所以不要写一个查询:
select user_id from user_tags
where user_id = 3086533
输出:
我想添加仅包含appID的user_id的子句,其中同时应用了“master_sbx”和“phonePicked”,因此输出将返回
希望这是有道理的。我不确定它在PostGreSQL中是否真的有可能但是会喜欢任何反馈!这是我要写的一个更大的查询。
答案 0 :(得分:3)
如果我理解正确,您希望测试一个user_id
是否(至少)出现在name = 'master_sbx'
的行中以及name = 'phonePicked'
行中。
有许多方法可以做到这一点。最佳选择取决于您问题中不存在的信息。一种方法是使用EXISTS
:
SELECT DISTINCT user_id
FROM user_tags
WHERE user_id = 3086533
AND name = 'master_sbx'
AND EXISTS (
SELECT 1 FROM user_tags
WHERE user_id = 3086533
AND name = 'phonePicked'
)
自我加入的另一种方式:
SELECT DISTINCT u1.user_id
FROM user_tags u1
JOIN user_tags u2 USING (user_id)
WHERE u1.user_id = 3086533
AND u1.name = 'master_sbx'
AND u2.name = 'phonePicked';
如果DISTINCT
是唯一的,那么 (user_id, name)
是多余的。
这可以视为relational division的特例。我们在这个相关的答案中汇集了一整套查询技术:
How to filter SQL results in a has-many-through relation