テーブルがあるとしましょう、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') ||
...
よりエレガントな解決策はありますか、それとも私はこれに固執する必要がありますか?ありがとう!
洗練された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;
行コンストラクター を次のように使用できます。
SELECT *
FROM email_phone_notes
WHERE (email, phone) IN (
('[email protected]', '555-1212'),
('[email protected]', '888-1212')
)