2

私は、ユーザー リストを姓名の配列に解析する Web (イントラネット) ツールを持っています。次に、次のようにその配列をループします (50 回になる可能性があります)。

SELECT * FROM users WHERE last_name = array[x].last AND first_name = array[x].first

IN2 つのプロパティを持つステートメントのように、姓と名の組み合わせをすべて同時にクエリすることは可能ですか。

可能であれば、見つかったすべての一致のレコード セットを返す単一のクエリです (2 つのプロパティを持つ IN ステートメントのように思います)。私はMySQLが得意ではありませんが、これは、サブクエリで名前の一致のリストを収集し、別のサブクエリで姓の一致を収集するようなものだと思います。

where first_name IN () OR last_name in ()一致する可能性のある結果セットを取得し、その結果セットをループして、姓と名の両方が一致する場所を最終チェックすることができるので、そこにクエリを作成したかどうかを実際に知っています。このデータベースは高速ですが、大規模です。たとえば、8,000 人以上のユーザーがいます

4

4 に答える 4

1

これは、MySQL の行コンストラクターを使用した優れたトリックです。

CREATE TABLE users (
    first VARCHAR(50),
    last Varchar(50)
);

INSERT INTO users (first, last) VALUES
('Bill', 'Gates'), ('Steve', 'Jobs'), ('Jon', 'Skeet');

SELECT *
  FROM users
 WHERE (first, last) = ('Bill', 'Gates')
    OR (first, last) = ('Steve', 'Jobs')
    OR (first, last) = ('Jon', 'Skeet');

http://sqlfiddle.com/#!2/6ef9a/2

また、次のものでも動作しINます。

SELECT *
  FROM users
 WHERE (first, last) IN(
   ('Bill', 'Gates'), ('Steve', 'Jobs'), ('Jon', 'Skeet')
);

http://sqlfiddle.com/#!2/6ef9a/6

于 2012-05-16T03:24:47.537 に答える
0

最初に名前を連結してから、IN 句を使用できます。

SELECT * FROM users WHERE CONCAT_WS('|', last_name, first_name) IN (...);
于 2012-05-16T02:27:40.123 に答える
0

8000 レコードは、最新のデータベースにとって「大規模」ではありません...「ごくわずか」です。とはいえ、現在のソリューションのパフォーマンスが十分でない場合 (これを尋ねる前にパフォーマンスを測定し、許容できないと判断しましたよね?)、「正しい」ソリューションは次のとおりです。

  1. nameKeyテーブルに列 (文字列) を追加する
  2. 「lastName|firstName」で挿入および更新時にデータを入力するトリガーを記述します。つまり、姓、データには含まれない区切り文字、および名の連結です。
  3. その上にインデックスを作成します
  4. 検索するときは、連結された「lastName|firstName」キーをIN()句に指定します。
于 2012-05-16T06:12:10.550 に答える
0

UNION個々の SQL クエリをまとめて、1 つの結果セットを取得できます。

SELECT * FROM users WHERE last_name = array[0].last AND array[0].first = first_name
    UNION
SELECT * FROM users WHERE last_name = array[1].last AND array[1].first = first_name
    UNION
SELECT * FROM users WHERE last_name = array[2].last AND array[2].first = first_name
于 2012-05-16T02:23:27.087 に答える