New*_*ang 13 mysql sql mysql-5.5
假设我有一张桌子,email_phone_notes看起来像这样:
+-----------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+--------------+------+-----+---------+-------+
| email | varchar | NO | PRI | NULL | |
| phone | varchar | NO | PRI | NULL | |
| notes | text | NO | | 0 | |
+-----------------------+--------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)
因此,每个电子邮件/电话组合都是唯一的,但您可以拥有多个电话号码不同的电子邮件地址,反之亦然.这有点做作,但它反映了我的情景.
我想做这样的查询:
SELECT * FROM email_phone_notes WHERE email = 'foo@bar.com' AND phone = '555-1212';
Run Code Online (Sandbox Code Playgroud)
但是,我想一次做多对,所以我不必进行多次SELECT查询.将对子组合在一起也很重要,因为我不想返回未请求的错误电话/电子邮件组合.
我可以做这样的事情,但是对于数百个值的可能性,查询将非常长.
SELECT * FROM email_phone_notes WHERE (
(email='foo@bar.com' && phone='555-1212') ||
(email='test@test.com' && phone='888-1212') ||
...
Run Code Online (Sandbox Code Playgroud)
有更优雅的解决方案,还是我应该坚持这个?谢谢!
egg*_*yal 27
如果您使用优雅的SQL,则可以使用行构造函数:
SELECT * FROM email_phone_notes WHERE (email, phone) IN (
('foo@bar.com' , '555-1212'),
('test@test.com', '888-1212')
-- etc.
);
Run Code Online (Sandbox Code Playgroud)
但是,这根本不是索引友好的,不会推荐给任何大小的表.相反,您可以使用所需的对实现表,并将其与表连接:
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;
Run Code Online (Sandbox Code Playgroud)
或者预填充(临时)表:
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16033 次 |
| 最近记录: |