16

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 = 'foo@bar.com' AND phone = '555-1212';

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

このようなこともできますが、値が数百になる可能性があるため、クエリは非常に長くなります。

SELECT * FROM email_phone_notes WHERE ( 
  (email='foo@bar.com' && phone='555-1212') || 
  (email='test@test.com' && phone='888-1212') || 
   ...

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

4

3 に答える 3

31

洗練された SQL を使用している場合は、行コンストラクターを使用できます。

SELECT * FROM email_phone_notes WHERE (email, phone) IN (
  ('foo@bar.com'  , '555-1212'),
  ('test@test.com', '888-1212')
  -- etc.
);

ただし、これはまったくインデックスに適しているわけではなく、かなりのサイズのテーブルではお勧めできません。代わりに、目的のペアでテーブルを具体化し、それをテーブルに結合できます。

SELECT * FROM email_phone_notes NATURAL JOIN (
  SELECT 'foo@bar.com' AS email, '555-1212' AS phone
UNION ALL
  SELECT 'test@test.com', '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
  ('foo@bar.com'  , '555-1212'),
  ('test@test.com', '888-1212')
  -- etc.
;

SELECT * FROM email_phone_notes NATURAL JOIN foo;
于 2012-11-17T00:07:41.190 に答える
2

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

SELECT *
FROM email_phone_notes
WHERE (email, phone) IN (
  ('foo@bar.com', '555-1212'),
  ('test@test.com', '888-1212')
)

SQLfiddle の例

于 2012-11-17T00:10:47.810 に答える