IN句がORに対して行うように、複数のANDステートメントを実行する簡単な方法はありますか?
3 に答える
これは Stack Overflow でよくある質問なので、新しいタグを作成していsql-match-all
ます。戻って、この問題に関連する古い回答のいくつかにタグを付けてみます。
あなたの簡単な説明に基づいて、タグ付けされた記事 (php、mysql、パフォーマンス) など、一連の値のすべてに一致する行のグループを返したいと思っていると思います。述語では、IN()
3 つのタグすべてが一致する必要はありませんが、特定のデータ行には 1 つのタグしかなく、WHERE 句は一度に 1 つの行しかテストできません。
この問題には 2 つの一般的な解決策があります。1 つ目は、行のグループ内の個別のタグの数を数えることです。一致させようとしているタグのリストと同じであれば、これはテストに合格します。
SELECT t.article
FROM Tags t
WHERE t.tag IN ('php', 'mysql', 'performance')
GROUP BY t.article
HAVING COUNT(DISTINCT tag) = 3;
もう 1 つの解決策は、探しているタグの数だけ自己参加することです。INNER JOIN を使用すると、一致するグループのみに結果セットを制限できます。
SELECT t1.article
FROM Tags t1
INNER JOIN Tags t2 USING (article)
INNER JOIN Tags t3 USING (article)
WHERE (t1.tag, t2.tag, t3.tag) = ('php', 'mysql', 'performance');
どちらのソリューションが優れているかは、照合するタグの数、アプリケーションでこのクエリを作成するのがどれほど便利か、および RDBMS のブランドが得意とする特定の最適化によって異なります。たとえば、MySQL は GROUP BY クエリの一時テーブルを書き込む傾向があるため、後者のソリューションは通常、MySQL ではるかに高速です。ただし、データベースで両方のクエリ タイプをテストして、確認する必要があります。
ALL キーワードを使用しますか?
一般的には不可能です
。列には 1 つの値しか格納でき
ません。次のような状況はありません。status = 1 AND status =2
例外的なケースはset data type