比较同一 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
以下获取具有两个给定成员的所有组:
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);
假设 userid
是 UNIQUE
。
Returns TRUE
或 FALSE
完全符合要求。
- 如果未找到 userid
或 groupid
为 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 更快。
最终这是relational-division的情况。下面是一系列查询技术:
- How to filter SQL results in a has-many-through relation
我有一个小 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
以下获取具有两个给定成员的所有组:
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);
假设 userid
是 UNIQUE
。
Returns TRUE
或 FALSE
完全符合要求。
- 如果未找到 userid
或 groupid
为 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 更快。
最终这是relational-division的情况。下面是一系列查询技术:
- How to filter SQL results in a has-many-through relation