查找所有具有特定帖子的男性用户SQL

查找所有具有特定帖子的男性用户SQL,sql,postgresql,Sql,Postgresql,假设我有一个Moder用户,他有许多帖子 例如,现在我选择男性用户: SELECT "users".* FROM "users" WHERE (gender = 'male') 如何扩展我的搜索查询并仅选择具有标签的帖子的男性用户[运动,假日] 如果我只需要使用Posts,我只需调用: SELECT "posts".* FROM "posts" WHERE "posts"."tag" IN ('sport','holiday') 所以我尝试的是: SELECT "users".* FROM

假设我有一个Moder
用户
,他有许多
帖子

例如,现在我选择男性用户:

SELECT "users".* FROM "users" WHERE (gender = 'male')
如何扩展我的搜索查询并仅选择具有标签的帖子的男性用户
[运动,假日]

如果我只需要使用
Posts
,我只需调用:

SELECT "posts".* FROM "posts" WHERE "posts"."tag" IN ('sport','holiday')
所以我尝试的是:

 SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" 
 WHERE "posts"."tag" IN ('sport', 'holiday') AND gender = 'male'

这个搜索查询的问题是,如果同一个用户有更多带有标签['sport'、'holiday']的帖子,它会多次返回该用户。如何更改搜索查询,使其只返回用户一次?谢谢

尝试
分组方式

按用户分组。id


或者
DISTINCT

尝试
GROUP BY

SELECT DISTINCT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" 
 WHERE "posts"."tag" IN ('sport', 'holiday') AND gender = 'male'
按用户分组。id

DISTINCT

SELECT DISTINCT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" 
 WHERE "posts"."tag" IN ('sport', 'holiday') AND gender = 'male'
将返回唯一的行

或者,正如第一条评论所说,使用分组方式

SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" 
 WHERE "posts"."tag" IN ('sport', 'holiday') AND gender = 'male'
Group by users.id
将返回唯一的行

或者,正如第一条评论所说,使用分组方式

SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" 
 WHERE "posts"."tag" IN ('sport', 'holiday') AND gender = 'male'
Group by users.id

您可以在子查询中使用IN运算符

SELECT "users".* 
FROM "users" 
WHERE "users"."id" IN (
    SELECT "posts"."user_id"
    FROM "posts"
    WHERE "posts"."tag" IN ('sport', 'holiday')
) AND gender = 'male'
ANY

SELECT "users".* 
FROM "users" 
WHERE "users"."id" = ANY(
    (
     SELECT ARRAY(
         SELECT "posts"."user_id"
         FROM "posts"
         WHERE "posts"."tag" IN ('sport', 'holiday'))
     )::integer[]
) AND gender = 'male'

您可以在子查询中使用IN运算符

SELECT "users".* 
FROM "users" 
WHERE "users"."id" IN (
    SELECT "posts"."user_id"
    FROM "posts"
    WHERE "posts"."tag" IN ('sport', 'holiday')
) AND gender = 'male'
ANY

SELECT "users".* 
FROM "users" 
WHERE "users"."id" = ANY(
    (
     SELECT ARRAY(
         SELECT "posts"."user_id"
         FROM "posts"
         WHERE "posts"."tag" IN ('sport', 'holiday'))
     )::integer[]
) AND gender = 'male'

尝试按用户id分组选择不同的用户。*…该查询返回带有标签的帖子
sport
holiday
。你确定这就是你想要的吗?尝试按用户id分组,选择不同的用户。*…该查询返回带有标签的帖子
sport
holiday
。你确定这就是你想要的吗?如果你愿意,前者会提供额外的信息:
SELECT users.*,将(1)作为num_posts从“users”内部加入“posts”中的“posts”。“user_id”=“users”。“id”中的“posts”。“tag”在('sport',holiday')中,性别=“male”组中的“users”。“id”
后者只提供给用户:
选择不同的用户。*从“用户”内部加入“帖子”中的“帖子”。“用户id”=“用户”,“id”中的“帖子”,“标签”在('sport'、'holiday')中,性别='male'
这是评论的副本/粘贴吗?猜测是针对评论而不是答案。前者提供了额外的信息,如果您愿意:
SELECT users.*,将(1)作为num_posts从“users”内部加入“posts”在“posts”上的“posts”。“user_id”=“users”。“id”在“posts”的位置。“tag”在('sport',holiday'),性别=“male”组中由“users”。“id”
后者只提供给用户:
选择不同的用户。*从“用户”内部加入“帖子”中的“帖子”。“用户id”=“用户”,“id”中的“帖子”,“标签”在('sport'、'holiday')中,性别='male'
这是评论的副本/粘贴吗?猜测是为了评论而不是答案。