1. ホーム
  2. mysql

[解決済み] 同じ列に対して複数のWHERE条件を指定してのSELECTING

2023-06-09 13:53:56

質問

しかし、私は同じ列で複数の条件に一致するレコードのみを返すクエリを書く必要があります。

私のテーブルは、ユーザーにフラグを適用するための非常に単純なリンク設定です...

ID   contactid  flag        flag_type 
-----------------------------------
118  99         Volunteer   1 
119  99         Uploaded    2 
120  100        Via Import  3 
121  100        Volunteer   1  
122  100        Uploaded    2

など...この場合、連絡先99と100の両方が、"Volunteer"と"Uploaded"の両方としてフラグされていることがわかります...。

私ができるようにする必要があるのは、検索フォームを介して入力された複数の条件に一致するコンタクトIDのみを返すことです...コンタクトIDは選択したすべてのフラグに一致しなければなりません...私の頭の中では、SQLは次のようになります。

SELECT contactid 
 WHERE flag = 'Volunteer' 
   AND flag = 'Uploaded'...

でも...これは何も返しません... 何か間違ったことをしているのでしょうか?

どのように解決するのですか?

この場合 GROUP BYHAVING COUNT(*) = _ :

SELECT contact_id
FROM your_table
WHERE flag IN ('Volunteer', 'Uploaded', ...)
GROUP BY contact_id
HAVING COUNT(*) = 2 -- // must match number in the WHERE flag IN (...) list

(仮に contact_id, flag が一意であると仮定して)。

または、joinを使用します。

SELECT T1.contact_id
FROM your_table T1
JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded'
-- // more joins if necessary
WHERE T1.flag = 'Volunteer'

もしフラグのリストが非常に長く、たくさんのマッチがある場合、おそらく最初の方が速いでしょう。フラグのリストが短く、マッチするものが少ない場合は、おそらく後者の方が速いでしょう。パフォーマンスが気になる場合は、両方のデータをテストして、どちらが最適か確認してください。