7

我有一个查询:

SELECT * FROM `users` 
WHERE (`firstname` LIKE 'Luke' AND `lastname` LIKE 'Skywalker') OR  
 (`firstname` LIKE 'Foo' AND `lastname` LIKE 'Bar') OR 
(`firstname` LIKE 'Tom' AND `lastname` LIKE 'Turner');

但我想通过使用 where ... in ... 使其更具可读性我试过

SELECT * FROM users 
WHERE `firstname` 
    IN ('Luke','Foo','Tom') AND `lastname` IN ('Skywalker','Bar','Turner');

但不幸的是,这也将匹配"Tom Skywalker""Foo Turner"并且您可以想到所有混合。

我必须选择名字和姓氏(也许更多字段,如 DOB),因为我从外部 API 获取数据,我必须检查这些名字是否在我们的系统中。

4

3 回答 3

4

使用LIKE不带通配符的运算符没有多大意义。我认为你应该使用=,特别是如果你必须使用check if those names are in our system

SELECT * FROM users
WHERE (firstname = 'Luke' AND lastname = 'Skywalker') OR 
      (firstname = 'Foo' AND lastname = 'Bar') OR 
      (firstname = 'Tom' AND lastname = 'Turner')

如果您使用IN运算符,如您所说,将匹配不同的组合。我认为前面的例子应该是比较它们的最快方法。

于 2012-04-11T17:49:12.980 回答
4
SELECT * 
FROM users
WHERE (firstname, lastname) 
      IN ( ('Luke', 'Skywalker') 
         , ('Foo' , 'Bar') 
         , ('Tom' , 'Turner')
         )
;
于 2012-04-11T17:54:13.220 回答
3

您可以将它们与concat

WHERE concat(`firstname`,'-',`lastname`)
   IN ('Luke-Skywalker', 'Foo-Bar', 'Tom-Turner');
于 2012-04-11T17:47:21.297 回答