我的请求似乎并不那么困难,但我不确定最好的方式来做到这一点。MySQL SELECT如果只匹配一个值
我有如下表:
userID file
1 1
1 2
1 3
2 1
2 3
3 2
4 1
4 2
,我想选择用户标识符,只有有文件号码2.在我的例子,结果将只有3
我的请求似乎并不那么困难,但我不确定最好的方式来做到这一点。MySQL SELECT如果只匹配一个值
我有如下表:
userID file
1 1
1 2
1 3
2 1
2 3
3 2
4 1
4 2
,我想选择用户标识符,只有有文件号码2.在我的例子,结果将只有3
SELECT userID
FROM tableName a
WHERE file = 2
GROUP BY userID
HAVING COUNT(*) =
(
SELECT COUNT(*)
FROM tableName b
WHERE a.userID = b.userID
)
你可以使用WHERE NOT EXISTS
(SQL 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
嗯,为什么downvote?两个例子都能产生正确的结果。 –
尝试此查询 -
SELECT userID FROM table
GROUP BY userID
HAVING COUNT(IF(file = 2, 1, NULL)) = COUNT(*)
+--------+
| userID |
+--------+
| 3 |
+--------+
一种方式是通过一个标志,如果他们有另外一个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的文件库。
谢谢,我会测试不同的解决方案 – MamaWalter