从表A中选择在表B上至少有X条记录的记录

时间:2015-10-07 04:11:05

标签: sql postgresql

我有一个名为users的表,另一个名为user_flags的表,另一个名为flags的表

users表包含nameid

flags表包含nameid

user_flags包含user_idflag_id

如果我想让所有拥有任何提供的标志名称的用户,那么查询是什么?也就是说,如果查询提供“红色”和“蓝色”但用户只是与蓝色相关联,我们将返回该用户。

也就是说,如果我有以下架构:http://sqlfiddle.com/#!9/ac105 - 我传递的标志名称是redblue,它将返回User John的行,因为约翰有一个red相关标志。

4 个答案:

答案 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'

SQL Fiddle

请注意,在小提琴中,表格和列名称与您在原始问题中使用的名称略有不同。

答案 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