3

私はこのようなテーブルを持っています

Table
-----
userid
fieldid
fieldvalue

ここで、useridとfieldidは、このテーブルの主キーのペアです。

fieldvalue選択したものに等しいものを持つすべてのユーザーを検索するSQLクエリを作成したいfieldid

たとえば、値の場合

fieldid: 817
fieldvalue: 'yes'

私は次のようなSQLクエリを持つことができます:

select userid FROM table where (fieldid=817 AND fieldvalue='yes') 

このクエリは正常に機能します。

ただし、2番目または3番目の基準がある場合は、次のようにクエリを実行します。

select userid 
FROM table 
where (fieldid=817 AND fieldvalue='yes')
AND (fieldid=818 AND fieldvalue='no') 

空の結果を返しますが、個々の基準で条件が満たされています。

これを修正する方法はありますか?

アップデート

ユースケースを書き留めるのを忘れました(謝罪)

userid, fieldid, fieldvalue
1 , 817, yes
1, 818, no
1, 825, yes 
2, 817, yes 
2, 818, yes
3, 829, no

このテーブルでは、次の条件を満たすユーザーを検索するSQLクエリが必要です。fieldid817の値はyesで、fieldid818の値はnoです。

ORの提案を使用して、これまでのところ、フィールドID 817の値がyesであるか、フィールドID818の値がnoであるかを満たしていました。

両方の条件を満たしてほしい。上記では、期待される結果は次のようになります

userid
1

ではなく

userid
1
2 

ユーザーID2は両方の条件を満たさないため。混乱をお詫び申し上げます。

4

6 に答える 6

2

OR異なる基準の間で使用する必要があります。

SELECT userid 
FROM table 
WHERE (fieldid=817 AND fieldvalue='yes')
    OR (fieldid=818 AND fieldvalue='no')

使用の違いAND/OR

AND演算子は、最初の条件と2番目の条件の両方が真の場合にレコードを表示します。

OR演算子は、最初の条件または2番目の条件のいずれかが真の場合にレコードを表示します。

編集:あなたのコメントに基づいて、あなたはそれを次のように行うことができます

select t1.userid 
FROM temp t1
where (t1.fieldid=817 AND t1.fieldvalue='yes') 
    AND EXISTS (SELECT userid 
            FROM temp t 
            WHERE t.userid =  t1.userid 
                AND fieldid=818 
                AND fieldvalue='no') 

作業コピーのあるsqlfiddleを参照してください

またはこのようにさえ

select t1.userid 
FROM temp t1
left join temp t2
    on t1.userid = t2.userid
where (t1.fieldid=817 AND t1.fieldvalue='yes')
    AND t2.fieldid=818 AND t2.fieldvalue='no'

ここに別のsqlfiddleがあります

参加したいフィールドが他にもある場合は、次のようにします。

select t1.userid 
FROM temp t1
left join temp t2
    on t1.userid = t2.userid
left join temp t3
    on t1.userid = t3.userid
where (t1.fieldid=817 AND t1.fieldvalue='yes')
    AND (t2.fieldid=818 AND t2.fieldvalue='no')
    AND (t3.fieldid=819 AND t3.fieldvalue='no')
于 2012-04-30T12:20:31.420 に答える
0

またはを使用してみてください

select userid FROM table where (fieldid=817 AND fieldvalue='yes') OR(fieldid=818 AND fieldvalue='no')

あなたのクエリは、フィールドIDを817と818にすることを望んでいましたが、これは不可能です。

于 2012-04-30T12:19:40.820 に答える
0

句にORnotを使用する必要がありANDます。すばやく簡単な説明については、WHEREこのリンクを確認してください。

于 2012-04-30T12:20:41.913 に答える
0

ORこんにちは代わりに試してくださいAND

select userid FROM table where (fieldid=817 AND fieldvalue='yes') OR (fieldid=818 AND fieldvalue='no')

を使用するAND 場合は、両方の条件とが満たされている必要があるかどうかがチェックさfieldid=817 AND fieldvalue='yes'fieldid=818 AND fieldvalue='no'ますが、それは不可能です。両方の条件の間に演算子を使用するとOR、両方の条件を持つ結果が得られます。

ありがとう

于 2012-04-30T12:20:49.563 に答える
0

を使用するための多くの提案に加えて、OR完全に正しいものを使用することもできますIN(これにより、スケーリングするとクエリが読みやすくなる可能性があります)。

SELECT userid FROM table WHERE (fieldid, fieldvalue) IN (
  (817, 'yes'),
  (818, 'no' )
);

両方のuserid条件を満たすすべてを見つけるには、それ自体に自己参加する必要があります。table

SELECT userid
FROM table AS t1 JOIN table AS t2 USING (userid)
WHERE
      (t1.fieldid = '817' AND t1.fieldvalue = 'yes')
  AND (t2.fieldid = '818' AND t2.fieldvalue = 'no' )
于 2012-04-30T12:22:02.807 に答える
0

次のように使用する必要があります。

select userid 
FROM table 
where fieldid in (817, 818) and fieldvalue in ('yes', 'no');
于 2012-04-30T12:25:25.897 に答える