gpt4 book ai didi

mysql - 如何在 WHERE 子句中使用多对批量 SELECT 行

转载 作者:IT老高 更新时间:2023-10-29 00:10:20 29 4
gpt4 key购买 nike

假设我有一张表,email_phone_notes,如下所示:

+-----------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+--------------+------+-----+---------+-------+
| email | varchar | NO | PRI | NULL | |
| phone | varchar | NO | PRI | NULL | |
| notes | text | NO | | 0 | |
+-----------------------+--------------+------+-----+---------+-------+

因此,每个电子邮件/电话组合都是独一无二的,但您可以有多个电子邮件地址和不同的电话号码,反之亦然。这有点做作,但它反射(reflect)了我的情况。

我想做这样的查询:

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') ||
...

有没有更优雅的解决方案,还是我应该坚持这个?

最佳答案

如果您追求优雅的 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;

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com