0

私の要求はそれほど難しくはないようですが、それを行うための最良の方法がわかりません。

私は次の表を持っています:

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

そして、ファイル番号が2しかないUserIDを選択したいと思います。私の例では、結果は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

1つの方法は、フラグを使用して、ユーザーの合計レコードに加えて#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

データサイズ(レコード数)は明らかにわかりませんが、1万人のユーザーと10万人のファイルがあり、ファイル#2にアクセスできるのは250人だけの場合、この2番目のクエリは最初に250人のユーザーにのみ関係し、次にキックします。 HAVING count=1に基づいて明示的なファイルベースが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 に答える