比较同一 table 中两行之间的一个字段

Compare one field between two rows in the same table

我有一个小 table,其中包含我正在努力查找查询的组成员资格。

   uid     groupid     userid
    1         2          5
    2         2          6
    3         1          2
    4         3          8
    5         4          7

我想知道如果两个给定的用户 ID 在同一组中,是否可以 return TRUE?

SELECT groupid, CASE WHEN COUNT(distinct userid) > 1 THEN "TRUE" ELSE "FALSE" END
FROM my_table
WHERE userid IN ('x', 'y')
GROUP BY groupid

请注意,x 和 y 应替换为给定的用户 ID

正确:

SELECT groupid, CASE WHEN COUNT(distinct userid) > 1 THEN 'TRUE' ELSE 'FALSE' END
FROM my_table
WHERE userid IN (5,6)
GROUP BY groupid

错误:

SELECT groupid, CASE WHEN COUNT(distinct userid) > 1 THEN 'TRUE' ELSE 'FALSE' END
FROM my_table
WHERE userid IN (5,2)
GROUP BY groupid

http://sqlfiddle.com/#!15/3f156/1

以下获取具有两个给定成员的所有组:

select groupid
from table t
where userid in ($userid1, $userid2)
group by groupid
having count(distinct userid) = 2;

如果您愿意,可以将其转换为布尔值:

select (case when count(*) > 0 then true else false end)
from (select groupid
      from table t
      where userid in ($userid1, $userid2)
      group by groupid
      having count(distinct userid) = 2
     ) g;

UNIQUE userid

每个用户最多只能有一个条目(就像问题似乎问的那样)。

SELECT (SELECT groupid FROM tbl WHERE userid = 5)
     = (SELECT groupid FROM tbl WHERE userid = 6);

假设 useridUNIQUE
Returns TRUEFALSE 完全符合要求
- 如果未找到 useridgroupid 为 NULL,则为 NULL

UNIQUE (userid, groupid)

每个用户只能有多个条目(如评论中所述):

共享所有群组?

SELECT EXISTS (
   SELECT 1
   FROM      (SELECT groupid FROM tbl2 WHERE userid = 5) a
   FULL JOIN (SELECT groupid FROM tbl2 WHERE userid = 6) b USING (groupid)
   WHERE a.groupid IS NULL OR
         b.groupid IS NULL
   ) AS share_all;

至少分享一组?

SELECT EXISTS (
   SELECT groupid FROM tbl2 WHERE userid = 8
   INTERSECT
   SELECT groupid FROM tbl2 WHERE userid = 9
   ) AS share_min_one;

SELECT EXISTS (
  SELECT 1
  FROM  (SELECT groupid FROM tbl2 WHERE userid = 5) a
  JOIN  (SELECT groupid FROM tbl2 WHERE userid = 6) b USING (groupid)
  ) AS share_min_one;

只分享一组吗?

SELECT count(*) = 1 AS share_exactly_one
FROM  (SELECT groupid FROM tbl2 WHERE userid = 5) a
JOIN  (SELECT groupid FROM tbl2 WHERE userid = 6) b USING (groupid);

SQL Fiddle测试数据更好

所有这些查询都很快,索引在 userid 上。在 Postgres 9.2+ 中 (userid, groupid) 上使用 multicolumn index 更快。

最终这是的情况。下面是一系列查询技术:

  • How to filter SQL results in a has-many-through relation