2017-03-24 7 views
0
SELECT user_id 
FROM $wpdb->usermeta 
WHERE (meta_key = 'first_name' AND meta_value LIKE $var1) AND (meta_key = 'age' AND meta_value = $var2) 
GROUP BY user_id 

このSQLクエリは正しいですか?SQL論理AND演算子

このようなAND演算子を使用できますか?(meta_key = 'first_name' AND meta_value LIKE $var1) AND (meta_key = 'age' AND meta_value = $var2)

+0

あなたはエラーがありますか? – scaisEdge

+0

常に0行を返します。 'meta_key'は 'first_name' **と等しいことはできませんし、**は 'age'を同時に指定することはできません。さらに集計をしないで 'GROUP BY'を使うことは意味がありません。 –

+0

クエリが機能しません。私が1 AND演算子をORに変更すると、それは機能します。このように '(meta_key = 'first_name' AND meta_value LIKE $ var1)または(meta_key = 'age' AND meta_value = $ var2)' – Coze

答えて

1

論理演算子andを使用できます。ただし、where句は各行に個別に適用されるため、取得しようとしている結果は得られません。そのような問題を処理する1つの方法は、where句のいくつかの条件を持っているし、それが満たされているどのようにこれらの多くをチェックするhaving句を使用することです:

SELECT user_id 
FROM  $wpdb->usermeta 
WHERE (meta_key = 'first_name' AND meta_value LIKE $var1) OR 
     (meta_key = 'age' AND meta_value = $var2) 
GROUP BY user_id 
HAVING COUNT(DISTINCT meta_key, meta_value) = 2 

必須のコメント:このようなコードを書くことは、SQLに対して脆弱コードを残すことができます注射による攻撃。変数置換の代わりにprepared statementを使用することを検討する必要があります。

+1

ありがとうございます! – Coze