0

我的要求似乎并不难,但我不确定最好的方法。

我有下表:

userID  file
   1      1
   1      2 
   1      3
   2      1
   2      3
   3      2
   4      1
   4      2

我想选择只有文件号 2 的用户 ID。在我的示例中,结果将只有 3。

4

4 回答 4

5
SELECT userID
FROM tableName a
WHERE file = 2
GROUP BY userID
HAVING COUNT(*) = 
(
  SELECT COUNT(*)
  FROM tableName b
  WHERE a.userID = b.userID 
)
于 2012-11-07T15:43:09.343 回答
1

您可以使用WHERE NOT EXISTSSQL Fiddle):

SELECT UserId
FROM theTable t
WHERE file = 2
AND NOT EXISTS(SELECT 1 FROM theTable tt WHERE t.UserId = tt.UserId AND file <> 2)
GROUP BY UserId

或自反连接(SQL Fiddle):

SELECT t.UserId
FROM theTable t
LEFT OUTER JOIN theTable tt ON t.UserId = tt.UserId AND tt.file <> 2
WHERE t.file = 2
AND tt.UserId IS NULL
GROUP BY t.UserId
于 2012-11-07T15:43:02.423 回答
0

一种方法是通过一个标志,一个 IF 标志,除了用户的总记录之外,他们还有一个 #2 文件......如果两者 = 1,那么你很好。但是,此版本会查询所有用户。

select
      userID
   from
      YourTable
   group by
      UserID
   having
          sum( if( file = 2, 1, 0 )) = 1
      AND count(*) = 1

此版本应用预查询仅列出那些至少有 #2 文件的人,然后获取总数

select
      PreQuery.UserID
   from
      ( select distinct YT1.userID
           from YourTable YT1
           where YT1.File = 2 ) as PreQuery
      JOIN  YourTable YT2
         on PreQuery.UserID = YT2.UserID
   group by
      PreQuery.UserID
   having
      count(*) = 1

我显然不知道您的数据大小(记录数),但是如果您有 10k 用户和 100k 文件,但只有 250 可以访问文件 #2,那么第二个查询将只关注 250 个用户,然后再踢仅基于 HAVING count = 1 仅具有单个显式文件的那些。

于 2012-11-07T16:42:09.400 回答
0

试试这个查询 -

SELECT userID FROM table
GROUP BY userID
HAVING COUNT(IF(file = 2, 1, NULL)) = COUNT(*)

+--------+
| userID |
+--------+
|      3 |
+--------+
于 2012-11-07T16:36:26.410 回答