2014-12-04 44 views
0

我有下面的表:如何高效地返回WHERE条件的行与多组值匹配?

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有人用表中找到了同名和另一个姓氏相同的人。找到组合很重要。

我的问题是:如何有效地执行mysql查询,如上面5个单个查询所规定的那样?

+0

你肯定你不能确定这里有什么错误? – Strawberry 2014-12-04 09:55:39

+0

您有不正确的SQL查询。 – Richie 2014-12-04 09:56:45

+0

是的,有一些'美丽'的错误,编辑它们。 – BastiaanWW 2014-12-04 10:05:38

回答

1

您可以使用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 
... 
+0

非常感谢。我在每个select语句前添加了iffnull,以确定是否找到结果。 – BastiaanWW 2014-12-05 10:06:55

2

这是你在找什么?

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

由于名单很大,这不是非常无效吗? – BastiaanWW 2014-12-04 10:06:03

+0

另外,如果采用这种方法,我不知道什么时候没有匹配某个组合(或者我需要检查一下循环服务器端,这也需要时间) – BastiaanWW 2014-12-04 10:06:48

+0

您可以将SELECT添加到'姓名和姓氏,并确认找到了哪一个。通过这种方法,您可以将查询简化为一个查询。无论如何,您需要在服务器上使用循环,因为您正在获取id的数组。 – DanR 2014-12-04 10:08:15

0

你也可以尝试以连接两个部分,搜索这样的:

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

OR

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

+0

该方法是否仍然使用名称索引? – BastiaanWW 2014-12-04 10:34:02

+0

@BastiaanWW我没有检查,所以不能肯定地说。但我认为它不会使用索引。如果数据集很大,那么你可以尝试一步步完成。填充包含FullName的新临时表,在FullName上索引临时表,然后运行上述查询。 – 2014-12-04 10:37:54