当前位置: 首页 > 面试题库 >

MySQL:如何在WHERE子句中对具有多对的SELECT行进行批量处理

胡鸿志
2023-03-14
问题内容

假设我有一张桌子,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 * 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子句中的多个值进行更新,包括了使用MySQL WHERE子句中的多个值进行更新的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 这是使用WHERE子句中的多个值更新的查询- 让我们再次检查表记录- 这将产生以下输出-

  • 如何将行号用作where子句的一部分? 我有,假设,25个数据,我只想得到前10行或得到从11到20的行。 如何使用行号?我无法执行下面的查询 更新:问题是,在我的where子句中,row_number在表UPDATE2:Thanks Guys中是未知的!不管怎样,我找到了这个。选择行号=行号的位置

  • 问题内容: 我有许多记录需要输入到表中。在查询中执行此操作的最佳方法是什么?我是否应该进行循环并在每次迭代中插入一条记录?或者,还有更好的方法? 问题答案: 从MySQL手册 使用VALUES语法的INSERT语句可以插入多行。为此,请包括多个列值列表,每个列值括在括号内并用逗号分隔。例:

  • 我正在使用PostgreSQL,并有一个名为的表,其中包含500万行和以下结构: 另一个表具有相同的行数和以下结构: 我需要 的值设置。如果我发出这样的声明: 这需要几个小时,而且我需要经常做这个手术。这两个表按id排序,id是惟一的,并且这两个表都有id。对我来说,用< code>table_flag中的值设置< code>table_all中的< code>some_flag只是执行从< co

  • 问题内容: 是否在SQL WHERE子句中对布尔表达式进行短路求值 ? 例如: 如果 @key IS NULL的 计算结果为true,则 @key不是NOT AND @key = t.Key的 计算结果吗? 如果否,为什么不呢? 如果是,是否可以保证?它是ANSI SQL的一部分还是特定于数据库的? 如果是特定于数据库的SqlServer?甲骨文?MySQL的? 问题答案: ANSI SQL草稿2

  • 问题内容: 在WHERE子句中有使用SELECT语句描述的名称吗?这是好/不好的做法吗? 这会是更好的选择吗? 它远没有那么优雅,但是运行起来比以前的版本要快。我不喜欢它,因为它在GUI中没有非常清晰地显示(并且SQL初学者需要理解它)。我可以将其分为两个独立的查询,但是随后事情变得混乱了…… 注意:我不仅需要日期和分数(例如姓名) 问题答案: 称为相关子查询。它有它的用途。