我有以下查询:
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
输出为:
我想添加仅包含应用了“master_sbx”和“phonePicked”的 id 的 user_id 的子句,因此输出只会返回
希望这是有道理的。我不确定它在 PostGreSQL 中是否真的可行,但希望得到任何反馈!这是我要编写的更大查询的一部分。
最佳答案
如果我理解正确,你想测试一个 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';
如果 (user_id, name)
是唯一的,则 DISTINCT
是多余的。
这可以视为 relational division 的特例.我们在这个相关的答案中汇集了一整套查询技术:
How to filter SQL results in a has-many-through relation
关于sql - 在查询中合并两个结果行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19800978/