2

我有一个网络(内联网)工具,可以将用户列表解析为名字和姓氏的数组。然后我循环遍历该数组(可能是 50 次),例如:

SELECT * FROM users WHERE last_name = array[x].last AND first_name = array[x].first

是否有可能以某种方式同时查询所有这些名字/姓氏组合,就像IN具有两个属性的语句一样。

如果可能的话,我会喜欢一个查询,该查询返回找到的每个匹配项的记录集(我想就像一个带有 2 个属性的 IN 语句)。我对 MySQL 不是很好,但我猜这就像让一个子查询收集任何名字匹配的列表,然后另一个子查询收集任何姓氏匹配。

实际上,您知道如果我只是在那里进行查询,因为where first_name IN () OR last_name in ()我会有一个包含任何可能匹配的结果集,然后我可以遍历该结果集,最后检查名字和姓氏都匹配的位置。这个数据库很快,但它很大。例如,有 8,000 多个用户

4

4 回答 4

1

这是 MySQL行构造函数的一个很好的技巧:

CREATE TABLE users (
    first VARCHAR(50),
    last Varchar(50)
);

INSERT INTO users (first, last) VALUES
('Bill', 'Gates'), ('Steve', 'Jobs'), ('Jon', 'Skeet');

SELECT *
  FROM users
 WHERE (first, last) = ('Bill', 'Gates')
    OR (first, last) = ('Steve', 'Jobs')
    OR (first, last) = ('Jon', 'Skeet');

http://sqlfiddle.com/#!2/6ef9a/2

它也适用于IN

SELECT *
  FROM users
 WHERE (first, last) IN(
   ('Bill', 'Gates'), ('Steve', 'Jobs'), ('Jon', 'Skeet')
);

http://sqlfiddle.com/#!2/6ef9a/6

于 2012-05-16T03:24:47.537 回答
0

您可以UNION将一堆单独的 SQL 查询放在一起并获得一个结果集。

SELECT * FROM users WHERE last_name = array[0].last AND array[0].first = first_name
    UNION
SELECT * FROM users WHERE last_name = array[1].last AND array[1].first = first_name
    UNION
SELECT * FROM users WHERE last_name = array[2].last AND array[2].first = first_name
于 2012-05-16T02:23:27.087 回答
0

您可以先连接名称,然后使用 IN 子句。

SELECT * FROM users WHERE CONCAT_WS('|', last_name, first_name) IN (...);
于 2012-05-16T02:27:40.123 回答
0

8000 条记录对于现代数据库来说并不“庞大”……它是“微小的”。也就是说,如果您当前的解决方案对您来说性能不够快(您确实测量了性能并在询问之前发现它是不可接受的,对吧?),“正确”的解决方案如下:

  1. 向表中添加nameKey列(字符串)
  2. 编写一个触发器以在插入时填充它并使用“lastName|firstName”进行更新;也就是说,姓氏、数据中不会出现的分隔符和名字的串联。
  3. 在上面创建索引
  4. IN()搜索时,在子句中提供串联的“lastName|firstName”键。
于 2012-05-16T06:12:10.550 回答