How do I design a database/query that queries users's answers to user tags My current setup in PostgreSQL:

CREATE TABLE "usertag" (
    "id" INTEGER NOT NULL DEFAULT E'nextval(\'usertag_id_seq\'::regclass)',
    "questionTitle" VARCHAR(255) NULL DEFAULT NULL,
    "factTitle" VARCHAR(255) NULL DEFAULT NULL,
    "type" VARCHAR(255) NULL DEFAULT NULL,
    "defaultAnswer" VARCHAR(255) NULL DEFAULT NULL,
    "priorityLevel" INTEGER NULL DEFAULT NULL,
    "created_at" TIMESTAMP NULL,
    "updated_at" TIMESTAMP NULL,
    PRIMARY KEY ("id")
)

CREATE TABLE "usertaganswer" (
    "id" INTEGER NOT NULL DEFAULT E'nextval(\'usertaganswer_id_seq\'::regclass)',
    "userId" INTEGER NULL DEFAULT NULL,
    "inactiveUserId" INTEGER NULL DEFAULT NULL,
    "tagId" INTEGER NULL DEFAULT NULL,
    "created_at" TIMESTAMP NULL,
    "updated_at" TIMESTAMP NULL,
    "numberAnswer" NUMERIC(8,2) NULL DEFAULT NULL,
    "textAnswer" VARCHAR(255) NULL DEFAULT NULL,
    PRIMARY KEY ("id")
)

CREATE TABLE "usertagansweroptions" (
    "id" INTEGER NOT NULL DEFAULT E'nextval(\'usertagansweroptions_id_seq\'::regclass)',
    "answer" VARCHAR(255) NULL DEFAULT NULL,
    "userTagId" INTEGER NULL DEFAULT NULL,
    "created_at" TIMESTAMP NULL,
    "updated_at" TIMESTAMP NULL,
    PRIMARY KEY ("id")
)

CREATE TABLE "usertaganswer_answeredoptions" (
    "id" INTEGER NOT NULL DEFAULT E'nextval(\'usertaganswer_answeredoptions_id_seq\'::regclass)',
    "userTagAnswerOptionId" INTEGER NULL DEFAULT NULL,
    "userTagAnswerId" INTEGER NULL DEFAULT NULL,
    "created_at" TIMESTAMP NULL,
    "updated_at" TIMESTAMP NULL,
    PRIMARY KEY ("id")
)


So if I'm query users based only on one userTag, that's fine. Here's an example of a query that works as expected:

select distinct "user"."id" 
from "user" 
inner join "usertaganswer" on "user"."id" = "usertaganswer"."userId" 
left outer join "usertaganswer_answeredoptions" on "usertaganswer"."id" = "usertaganswer_answeredoptions"."userTagAnswerId" 
where "allowedToInteractWith" = true 
and "usertaganswer"."numberAnswer" between 5 and 30


but when I try adding a criterion, I can't wrap my head around it. This works: 

select distinct "user"."id" 
from "user" 
inner join "usertaganswer" on "user"."id" = "usertaganswer"."userId" 
left outer join "usertaganswer_answeredoptions" on "usertaganswer"."id" = "usertaganswer_answeredoptions"."userTagAnswerId" 
where "allowedToInteractWith" = true
and (
    "usertaganswer_answeredoptions"."userTagAnswerOptionId" = '5' 
    or "usertaganswer_answeredoptions"."userTagAnswerOptionId" = '6'
    or "usertaganswer_answeredoptions"."userTagAnswerOptionId" = 4 
)


but I don't want an 'or' of all the criteria I want an 'and'. But if I do the following, it will return zero results even thought it should return 1

SELECT "user"."id"
from "user" 
inner join "usertaganswer" on "user"."id" = "usertaganswer"."userId" 
left outer join "usertaganswer_answeredoptions" on "usertaganswer"."id" = "usertaganswer_answeredoptions"."userTagAnswerId" 
where "allowedToInteractWith" = TRUE
AND  (
    "usertaganswer_answeredoptions"."userTagAnswerOptionId" = '5' 
    or "usertaganswer_answeredoptions"."userTagAnswerOptionId" = '6'
)
AND "usertaganswer_answeredoptions"."userTagAnswerOptionId" = 4
(
&quot;usertaganswer_answeredoptions&quot;.&quot;userTagAnswerOptionId&quot; = '5' 
or &quot;usertaganswer_answeredoptions&quot;.&quot;userTagAnswerOptionId&quot; = '6'
or &quot;usertaganswer_answeredoptions&quot;.&quot;userTagAnswerOptionId&quot; = 4 
) 

but I don't want an 'or' of all the criteria I want an 'and'. But if I do the following, it will return zero results even thought it should return 1

Zero is the correct result.
usertaganswer_answeredoptions.userTagAnswerOptionId can have the single value at the time. It cannot be at the same time equal to 4, 5 and 6. It can be (4 OR 5 OR 6) not (4 AND 5 AND 6).