假设我有一张桌子,email_phone_notes看起来像这样:
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
我可以做这样的事情,但是对于数百个值的可能性,查询将非常长。
SELECT * FROM email_phone_notes WHERE ( (email='foo@bar.com' && phone='555-1212') || (email='test@test.com' && phone='888-1212') || ...
有没有更优雅的解决方案,还是我应该坚持呢?谢谢!
如果您追求优雅的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;