我有两个表,“user”和“user_things”。我希望为所有用户提供一个或多个东西,但我不想自己检索这些东西(我只希望每个用户返回一行)。
Table 1:
id
username
Table 2:
id
userid
thingname
示例:我想找到所有拥有“帽子”和“汽车”的用户。如果有两个用户,我只想返回两行(而不是4行)。
答案 0 :(得分:2)
使用聚合:
select u.userid, u.username
from user u join
user_things ut
on ut.userid = u.id
group by t1.userid, t1.username
having sum(case when ut.thingname = 'hat' then 1 else 0 end) > 0 and
sum(case when ut.thingname = 'car' then 1 else 0 end) > 0
having
子句的第一部分计算“帽子”的数量。第二个计算“汽车”的数量。 >
条件要求两者都存在。
答案 1 :(得分:2)
更简单的解决方案是
select user.id, user.name
from user
inner join things t on t.userid = user.id
where t.thingname in ('car', 'hat')
group by user.id, user.name
having count(*) >= 2; -- (2 for 'car' and 'hat', 3 for 'car', 'hat' and 'bike', ...)
答案 2 :(得分:1)
在另一个表格中选择“car”和“hat”exists
的记录的所有用户。
select
*
from
User u
where
exists (
select 'x'
from Things t
where t.userid = u.id and t.thingname = 'hat') and
exists (
select 'x'
from Things t
where t.userid = u.id and t.thingname = 'car')
或者,您可以这样做,虽然我认为它不太好,语义更不正确:
select distinct
u.*
from
Users u
inner join Things tc on tc.userid = u.id and tc.thingname = 'car'
inner join Things th on th.userid = u.id and th.thingname = 'hat'
甚至:
select
u.*
from
Users u
where
(select
count('x')
from Things t
where t.userid = u.id and t.thingname in ('car', 'hat')) = 2
虽然最后一个也可能会返回没有汽车和两个帽子的用户。