2012-11-07 65 views
-1

我的请求似乎并不那么困难,但我不确定最好的方式来做到这一点。MySQL SELECT如果只匹配一个值

我有如下表:

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

,我想选择用户标识符,只有有文件号码2.在我的例子,结果将只有3

+0

谢谢,我会测试不同的解决方案 – MamaWalter

回答

5
SELECT userID 
FROM tableName a 
WHERE file = 2 
GROUP BY userID 
HAVING COUNT(*) = 
(
    SELECT COUNT(*) 
    FROM tableName b 
    WHERE a.userID = b.userID 
) 
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 
+0

嗯,为什么downvote?两个例子都能产生正确的结果。 –

0

尝试此查询 -

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

+--------+ 
| userID | 
+--------+ 
|  3 | 
+--------+ 
0

一种方式是通过一个标志,如果他们有另外一个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的文件库。

相关问题