如何有效地返回具有多组要匹配的值的 WHERE 条件的行


How can I efficiently return rows for a WHERE condition with multiple sets of values to match?

>我有一个包含以下列的表格:

id, name, surname

我有以下sql查询:

SELECT `id` from `table` WHERE name = 'John' AND surname = 'Smith';

由于我有一个名字和姓氏的列表,我想检查它们是否存在于表中,我想进行单个查询并返回 id(如果一组的姓名和姓氏都匹配)或空 id(或零)以指示名称和姓氏的组合不匹配。

所以我基本上是这样的:

SELECT `id` from `table` WHERE name = 'John' AND surname = 'Smith';
SELECT `id` from `table` WHERE name = 'Claudia' AND surname = 'Janssen';
SELECT `id` from `table` WHERE name = 'Eduart' AND surname = 'Allen';
SELECT `id` from `table` WHERE name = 'Don' AND surname = 'Diablo';
SELECT `id` from `table` WHERE name = 'Esther' AND surname = 'Smith';

(大量此类查询)

我认为语句 IN 不起作用,因为如果在表中找到同名的人和另一个同姓的人,它也会返回一个 id。找到组合很重要。

我的问题是:如何按照上述 5 个单个查询的规定有效地执行 mysql 查询?

这是你要找的吗?

SELECT `id` 
FROM   `table` 
WHERE  (`name` = 'John' AND `surname` = 'Smith') 
        OR (`name` = 'Claudia' AND `surname` = 'Janssen') 
        OR (`name` = 'Eduart' AND `surname` = 'Allen') 
        OR (`name` = 'Don' AND `surname` = 'Diablo') 
        OR (`name` = 'Esther' AND `surname` = 'Smith');
您可以使用

OR

SELECT id
FROM table
WHERE (name = 'John' and surname 'Smith')
OR (name = 'Claudia' and surname 'Janssen')
OR (name = 'Eduart' and surname 'Allen')
...

请确保使用括号,因为 ANDOR 之间的优先级。

您也可以使用 UNION 来执行此操作,如果您在namesurname列上有索引,这可能会更有效,因为OR条件可能不会使用它们。

SELECT id from table WHERE name = 'John' and surname 'Smith'
UNION
SELECT id from table WHERE name = 'Claudia' and surname 'Janssen'
UNION
SELECT id from table WHERE name = 'Eduart' and surname 'Allen'
UNION
...

您也可以尝试将这两个部分连接起来并像这样搜索:

SELECT id, CONCAT_WS(",", surname, name) AS FullName
FROM table1
HAVING FullName IN (
  "hand,bob", 
  "smith,steve", 
  "brown,rob", 
  "green,tom"
)

SELECT id, CONCAT_WS(",", surname, name) AS FullName
FROM table1
WHERE CONCAT_WS(",", surname, name) IN (
  "hand,bob", 
  "smith,steve", 
  "brown,rob", 
  "green,tom"
)

工作小提琴:http://sqlfiddle.com/#!2/2463e6