Php 如何有效地为WHERE条件返回多组值匹配的行?

Php 如何有效地为WHERE条件返回多组值匹配的行?,php,mysql,Php,Mysql,我有一个包含以下列的表: id, name, surname 我有以下sql查询: SELECT `id` from `table` WHERE name = 'John' AND surname = 'Smith'; 由于我有一个名称和姓氏列表,我想检查它们是否存在于表中,因此我想进行一次查询并返回id(如果集合的名称和姓氏都匹配)或空id(或零),以表明名称和姓氏的组合不匹配 所以我基本上是这样的: SELECT `id` from `table` WHERE name = 'John'

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

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';
(这些查询中有大量)

我认为中的语句不起作用,因为如果在表中找到同名的人和同名的人,它也会返回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');

这就是你要找的吗

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');

这就是你要找的吗

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');

这就是你要找的吗

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');

您可以使用

SELECT id
FROM table
WHERE (name = 'John' and surname 'Smith')
OR (name = 'Claudia' and surname 'Janssen')
OR (name = 'Eduart' and surname 'Allen')
...
确保使用括号,因为
之间的优先级较高

您还可以使用
UNION
,如果在
name
names
列上有索引,这可能会更有效,因为
条件可能不使用它们

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
FROM table
WHERE (name = 'John' and surname 'Smith')
OR (name = 'Claudia' and surname 'Janssen')
OR (name = 'Eduart' and surname 'Allen')
...
确保使用括号,因为
之间的优先级较高

您还可以使用
UNION
,如果在
name
names
列上有索引,这可能会更有效,因为
条件可能不使用它们

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
FROM table
WHERE (name = 'John' and surname 'Smith')
OR (name = 'Claudia' and surname 'Janssen')
OR (name = 'Eduart' and surname 'Allen')
...
确保使用括号,因为
之间的优先级较高

您还可以使用
UNION
,如果在
name
names
列上有索引,这可能会更有效,因为
条件可能不使用它们

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
FROM table
WHERE (name = 'John' and surname 'Smith')
OR (name = 'Claudia' and surname 'Janssen')
OR (name = 'Eduart' and surname 'Allen')
...
确保使用括号,因为
之间的优先级较高

您还可以使用
UNION
,如果在
name
names
列上有索引,这可能会更有效,因为
条件可能不使用它们

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
HAVING FullName IN (
  "hand,bob", 
  "smith,steve", 
  "brown,rob", 
  "green,tom"
)


工作小提琴:

您也可以尝试将这两个部分连接起来,并按如下方式进行搜索:

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
HAVING FullName IN (
  "hand,bob", 
  "smith,steve", 
  "brown,rob", 
  "green,tom"
)




Working fiddle:

您确定无法在此处识别任何错误吗?您的SQL查询不正确。是的,有一些“美丽”错误,请编辑它们。引号用于创建字符串。如果要转义列名和表名,应使用反勾号。是否确定此处无法识别任何错误?您的SQL查询不正确。是的,存在一些“美观”错误,请编辑它们。引号用于创建字符串。如果要转义列名和表名,应使用反勾号。是否确定此处无法识别任何错误?您的SQL查询不正确。是的,存在一些“美观”错误,请编辑它们。引号用于创建字符串。如果要转义列名和表名,应使用反勾号。是否确定此处无法识别任何错误?您的SQL查询不正确。是的,存在一些“美观”错误,请编辑它们。引号用于创建字符串。如果要转义列和表名,应该使用反勾号。由于名称列表很大,这不是很有效吗?此外,使用这种方法,我不知道什么时候某个组合不匹配(或者我必须使用循环服务器端进行检查,这也需要时间)您可以添加到列表中,选择
名称
姓氏
,并验证找到了哪一个。使用这种方法,您可以将查询减少为一个查询。无论如何,您都需要在服务器上使用loop,因为您要返回id的数组。由于名称列表很大,这不是很有效吗?另外,使用这种方法,我不知道什么时候某个组合不匹配(或者我必须使用loop服务器端进行检查,这也需要时间)您可以添加到列表中,选择
名称
姓氏
,并验证找到了哪一个。使用这种方法,您可以将查询减少为一个查询。无论如何,您都需要在服务器上使用loop,因为您要返回id的数组。由于名称列表很大,这不是很有效吗?另外,使用这种方法,我不知道什么时候某个组合不匹配(或者我必须使用loop服务器端进行检查,这也需要时间)您可以添加到列表中,选择
名称
姓氏
,并验证找到了哪一个。使用这种方法,您可以将查询减少为一个查询。无论如何,您都需要在服务器上使用loop,因为您要返回id的数组。由于名称列表很大,这不是很有效吗?另外,使用这种方法,我不知道什么时候某个组合不匹配(或者我必须使用loop服务器端进行检查,这也需要时间)您可以添加到列表中,选择
名称
姓氏
,并验证找到了哪一个。使用这种方法,您可以将查询减少为一个查询。无论如何,您都需要在服务器上使用loop,因为您要返回id的数组。这种方法是否仍然使用name上的索引?@BastiaanWW我没有选中,所以不能说是sur