web-dev-qa-db-ja.com

MySQL:WHERE句で複数のペアを持つSELECT行を一括処理する方法

テーブルがあるとしましょう、email_phone_notes次のようになります:

+-----------------------+--------------+------+-----+---------+-------+
| Field                 | Type         | Null | Key | Default | Extra |
+-----------------------+--------------+------+-----+---------+-------+
| email                 | varchar      | NO   | PRI | NULL    |       |
| phone                 | varchar      | NO   | PRI | NULL    |       |
| notes                 | text         | NO   |     | 0       |       |
+-----------------------+--------------+------+-----+---------+-------+

したがって、電子メールと電話の組み合わせはそれぞれ一意ですが、電話番号が異なる複数の電子メールアドレスを使用することも、その逆も可能です。これは少し不自然ですが、私のシナリオを反映しています。

次のようなクエリを実行したいと思います。

SELECT * FROM email_phone_notes  WHERE email = '[email protected]' AND phone = '555-1212';

ただし、一度に複数のペアを実行したいので、複数のSELECTクエリを実行する必要はありません。要求されなかった誤った電話と電子メールの組み合わせを返したくないので、ペアを一緒に保つことも重要です。

私はこのようなことをすることができますが、数百の値の可能性のために、クエリは本当に長くなります。

SELECT * FROM email_phone_notes WHERE ( 
  (email='[email protected]' && phone='555-1212') || 
  (email='[email protected]' && phone='888-1212') || 
   ...

よりエレガントな解決策はありますか、それとも私はこれに固執する必要がありますか?ありがとう!

15
Newtang

洗練されたSQLが必要な場合は、行コンストラクターを使用できます。

SELECT * FROM email_phone_notes WHERE (email, phone) IN (
  ('[email protected]'  , '555-1212'),
  ('[email protected]', '888-1212')
  -- etc.
);

ただし、これはインデックスに適しているわけではなく、大きなサイズのテーブルでは推奨されません。代わりに、必要なペアを使用してテーブルを実体化し、それをテーブルと結合することができます。

SELECT * FROM email_phone_notes NATURAL JOIN (
  SELECT '[email protected]' AS email, '555-1212' AS phone
UNION ALL
  SELECT '[email protected]', '888-1212'
-- etc.
) t;

または、(一時的な)テーブルに事前入力します。

CREATE TEMPORARY TABLE foo (PRIMARY KEY (email, phone)) Engine=MEMORY
  SELECT email, phone FROM email_phone_notes WHERE FALSE
;

INSERT INTO foo
  (email, phone)
VALUES
  ('[email protected]'  , '555-1212'),
  ('[email protected]', '888-1212')
  -- etc.
;

SELECT * FROM email_phone_notes NATURAL JOIN foo;
27
eggyal

行コンストラクター を次のように使用できます。

SELECT *
FROM email_phone_notes
WHERE (email, phone) IN (
  ('[email protected]', '555-1212'),
  ('[email protected]', '888-1212')
)

SQLfiddleの例

1
AndreKR