当你需要一对字段来匹配时,如何执行IN()之类的操作?

时间:2012-05-16 02:20:18

标签: mysql

我有一个Web(Intranet)工具,可以将用户列表解析为名字和姓氏数组。然后我循环遍历该数组(可能是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 个答案:

答案 0 :(得分:1)

这是MySQL row constructors的一个很好的技巧:

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

SELECT * FROM users WHERE CONCAT_WS('|', last_name, first_name) IN (...);

答案 3 :(得分:0)

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

  1. nameKey列(字符串)添加到表
  2. 编写一个触发器,在插入时填充它并使用“lastName | firstName”更新;也就是说,姓氏的连接,数据中不会出现的分隔符,以及名字。
  3. 在其上创建索引
  4. 搜索时,请在IN()子句中提供连接的“lastName | firstName”键。