テーブル間で単純な 1 ステートメント SQL 検索を実行するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/56334

  •  09-06-2019
  •  | 
  •  

質問

2 つのテーブルが存在すると仮定します。 users そして groups.

ユーザーがテキストを入力すると、名前にそのテキストが含まれるユーザーとグループの両方が結果に含まれる「単純な検索」をどのように提供するのでしょうか?

検索の結果は 2 つのタイプを区別する必要があります。

役に立ちましたか?

解決

コツは組み合わせることです UNION リテラル文字列を使用して、返される「オブジェクト」のタイプを決定します。ほとんど (?) の場合、UNION ALL の方が効率的であり、サブクエリで重複が必要でない限り、UNION ALL を使用する必要があります。次のパターンで十分です。

 SELECT "group" type, name
   FROM groups
  WHERE name LIKE "%$text%"
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE name LIKE "%$text%"

注記:昨日この問題に遭遇し、良い解決策が見つからず、この方法を使用したため、自分で答えを追加しました。誰かがより良いアプローチを持っている場合は、お気軽に追加してください。

他のヒント

「UNION ALL」を使用すると、DB は重複を削除しようとしません。とにかく 2 つのクエリ間に重複が存在しないため (最初の列が異なるため)、UNION ALL の方が高速になります。
(削除したい各クエリ内に重複がないことを前提としています)

LIKE を使用すると、LIKE コンパレータが % で始まるときに毎回テーブル スキャンが必要になるため、多くの問題が発生します。これにより、SQL はすべての行をチェックし、比較に使用している文字列をバイトごとに処理するようになります。開始時にはこれで問題ないかもしれませんが、すぐにスケーリングの問題が発生します。

これを処理するより良い方法は、全文検索を使用することです。これはより複雑なオプションですが、非常に大規模なデータベースではより良い結果が得られます。その後、Bobby Jack が提供したサンプルの機能バージョンを使用できます。 UNION ALL 2 つの結果セットをまとめて結果を表示します。

別の追加をお勧めします

 SELECT "group" type, name
   FROM groups
  WHERE UPPER(name) LIKE UPPER("%$text%")
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE UPPER(name) LIKE UPPER("%$text%")

最初に $text を大文字に変換することも、クエリ内でのみ行うこともできます。こうすることで、大文字と小文字を区別しない検索が可能になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top