查找具有相同ID的行并具有一组特定名称

时间:2011-12-27 13:38:37

标签: sql database group-by

编辑:

我有一个包含3行的表格。

ID    NAME REV
1     A    0
1     B    0
1     C    0
2     A    1
2     B    0
2     C    0
3     A    1
3     B    1

我想找到具有特定名称集的ID,并且REV是相同的 例: Edit2:GBN的解决方案可以很好地工作,但由于我没有创建新表的权限。添加的约束是不能创建新表。

if input = A,B then output is 3
if input = A ,B,C then output is 1 and not 1,2 since the rev level differs in 2.

3 个答案:

答案 0 :(得分:5)

最简单的方法是将每个ID的COUNT与列表中元素的数量进行比较:

SELECT
   ID
FROM
   MyTable
WHERE
   NAME IN ('A', 'B', 'C')
GROUP BY
   ID
HAVING
   COUNT(*) = 3;

注意:不需要ORDER BY,如果需要,可以在HAVING之后

编辑,问题更新。在MySQL中,为搜索词使用单独的表更容易

DROP TABLE IF EXISTS gbn;
CREATE TABLE gbn (ID INT, `name` VARCHAR(100), REV INT);
INSERT gbn VALUES (1, 'A', 0);
INSERT gbn VALUES (1, 'B', 0);
INSERT gbn VALUES (1, 'C', 0);
INSERT gbn VALUES (2, 'A', 1);
INSERT gbn VALUES (2, 'B', 0);
INSERT gbn VALUES (2, 'C', 0);
INSERT gbn VALUES (3, 'A', 0);
INSERT gbn VALUES (3, 'B', 0);

DROP TABLE IF EXISTS gbn1;
CREATE TABLE gbn1 ( `name` VARCHAR(100));
INSERT gbn1 VALUES ('A');
INSERT gbn1 VALUES ('B');

SELECT
   gbn.ID
FROM
   gbn
   LEFT JOIN
   gbn1 ON gbn.`name` = gbn1.`name`
GROUP BY
   gbn.ID
HAVING
   COUNT(*) = (SELECT COUNT(*) FROM gbn1)
   AND MIN(gbn.REV) = MAX(gbn.REV);

INSERT gbn1 VALUES ('C');

SELECT
   gbn.ID
FROM
   gbn
   LEFT JOIN
   gbn1 ON gbn.`name` = gbn1.`name`
GROUP BY
   gbn.ID
HAVING
   COUNT(*) = (SELECT COUNT(*) FROM gbn1)
   AND MIN(gbn.REV) = MAX(gbn.REV);

编辑2,没有额外的表,使用派生(内联)表:

SELECT
   gbn.ID
FROM
   gbn
   LEFT JOIN
   (SELECT 'A' AS `name`
    UNION ALL SELECT 'B' 
    UNION ALL SELECT 'C'
   ) gbn1 ON gbn.`name` = gbn1.`name`
GROUP BY
   gbn.ID
HAVING
   COUNT(*) = 3 -- matches number of elements in gbn1 derived table
   AND MIN(gbn.REV) = MAX(gbn.REV);

答案 1 :(得分:1)

与gbn类似,但允许重复ID /名称组合的可能性:

SELECT ID
FROM MyTable
WHERE NAME IN ('A', 'B', 'C')
GROUP BY ID
HAVING COUNT(DISTINCT NAME) = 3;

答案 2 :(得分:1)

好的!...我解决了我的问题!我修改了GBN的逻辑,没有使用IN子句的搜索表

执行MAX(rev)= MIN(REV)的1个缺陷是:如果我有这样的数据。

ID    NAME   REV
1     A      0
1     B      1
1     A      1

然后我使用像

这样的查询
Select ID from TABLE
where NAME in {A,B}
groupby ID
having count(*) = 2
and MIN(REV) = MAX(REV)

它不会显示ID 1,因为最小值和最大值不同,计数为3。

所以我只需在groupby中添加另一列

所以最后的查询是

Select ID from TABLE
where NAME in {A,B}
groupby ID,REV
having count(*) = 2
and MIN(REV) = MAX(REV)

谢谢所有帮助过的人。 !