假设我有一张表,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;

关于mysql - MySQL:如何在WHERE子句中批量选择具有多对的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13426203/

10-16 13:25