我有一个名为users
的表,另一个名为user_flags
的表,另一个名为flags
的表
users
表包含name
和id
flags
表包含name
和id
user_flags
包含user_id
和flag_id
如果我想让所有拥有任何提供的标志名称的用户,那么查询是什么?也就是说,如果查询提供“红色”和“蓝色”但用户只是与蓝色相关联,我们将返回该用户。
也就是说,如果我有以下架构:http://sqlfiddle.com/#!9/ac105 - 我传递的标志名称是red
和blue
,它将返回User John的行,因为约翰有一个red
相关标志。
答案 0 :(得分:0)
尝试此查询:
SELECT u.name
FROM users u INNER JOIN user_flags uf
ON u.id = uf.user_id
INNER JOIN flags f
ON uf.flag_id = f.id
WHERE F.name = 'red'
请注意,在小提琴中,表格和列名称与您在原始问题中使用的名称略有不同。
答案 1 :(得分:0)
您需要在表的id值上加入表,并使用where子句作为标志颜色名称。像这样:
select * from Users U
join UsersFlags UF on UF.user_id = U.id
join Flags F on F.id = UF.flag_id
where F.name = 'red'
答案 2 :(得分:0)
试试这个
SELECT s.id,s.name
FROM @users s
JOIN @users_flag uf ON s.id = uf.uid
JOIN @flag f ON f.id = uf.fid
WHERE f.NAME IN ('red','Blue')
答案 3 :(得分:0)
SELECT u.id
,u.name
,f.name flag
FROM USERS u
JOIN flags f using(id)
JOIN UsersFlags uf on f.id=uf.flag_id
WHERE
f.name in ('red','blue') -- or f.name in (select name from flags)
-- or f.name = any(array['red','blue'])
和另一个
SELECT u.NAME
FROM USERS u
WHERE id IN (
SELECT uf.user_id
FROM UsersFlags uf
JOIN flags f ON uf.flag_id = f.id
WHERE f.NAME IN (
'red'
,'blue'
)
)
输出:
id name flag
-- ---- ----
1 John red