2016-04-15 61 views
2

newlist - 20000个数据这是内部加入声明是否正确?

recordlist - 200000个数据

我希望显示newlist所有比赛记录recordlist

它必须是匹配的名字,中间名,姓氏

SELECT new.FIRSTNAME,new.MIDDLENAME,new.LASTNAME 
FROM newlist as new 
INNER JOIN recordlist as bgc ON new.FIRSTNAME = bgc.FIRSTNAME 
AND new.MIDDLENAME = bgc.MIDDLENAME AND new.LASTNAME = bgc.LASTNAME"; 

是这个查询是否正确?显示所有的比赛?

+3

该查询是正确的,但您的逻辑将匹配具有相同名称或相同中间名或相同姓氏的任何内容。例如,“John Snow”将与“John Rain”相匹配,因为firstname是一样的。根据数据,这可能会导致匹配的乘法。要改变这种情况,你应该改变你的“OR”为“AND”。 – Th0rndike

+0

为什么不试试看看它是否返回预期结果 – Jester

+0

问题是由于记录列表有200,000条记录需要花费时间加载。 –

回答

0

您索引了我假设的三列数据吗?如果不这样做:)

当他们已经索引:

拥有多个或的,有时它能够更好地将查询并加入结果集与联盟。这用于使用索引。

SELECT new.FIRSTNAME,new.MIDDLENAME,new.LASTNAME 
FROM newlist as new 
INNER JOIN recordlist as bgc ON new.FIRSTNAME = bgc.FIRSTNAME 
UNION 
SELECT new.FIRSTNAME,new.MIDDLENAME,new.LASTNAME 
FROM newlist as new 
INNER JOIN recordlist as bgc ON new.MIDDLENAME = bgc.MIDDLENAME 
UNION 
SELECT new.FIRSTNAME,new.MIDDLENAME,new.LASTNAME 
FROM newlist as new 
INNER JOIN recordlist as bgc ON new.LASTNAME = bgc.LASTNAME" 
+0

嗯,我很确定索引名字是一个可怕的想法,因为两个人可以定义为具有相同的名字。 –

+0

索引并不意味着它必须是唯一索引。例如:当你在寻找John Doe的电话号码时,你开始以“D”开始寻找所有名字?这是使用索引。 – Johan

+0

哦,你是对的,该死的我有工作要做我的新表! –

0

你没有提到有关索引的任何内容。我假设你没有使用它们。凭借一张长200,000的桌子,你基本上不得不这样做。

添加索引可能需要一段时间,但每个表只需执行一次。如果在创建表格时完成,则需要< 10毫秒。

添加索引:

ALTER TABLE `new` ADD INDEX (FIRSTNAME, MIDDLENAME, LASTNAME); 
ALTER TABLE `bcg` ADD INDEX (FIRSTNAME, MIDDLENAME, LASTNAME); 

然后你可以用下面的查询做你的事:

SELECT 
    `new`.FIRSTNAME, 
    `new`.MIDDLENAME, 
    `new`.LASTNAME 
FROM newlist `new` 
    INNER JOIN recordlist `bgc` 
    ON `new`.FIRSTNAME = `bgc`.FIRSTNAME 
     AND `new`.MIDDLENAME = `bgc`.MIDDLENAME 
     AND `new`.LASTNAME = `bgc`.LASTNAME"; 
+0

这是错误的答案 –

+0

@VigneshKumar嗯,你能在这里详细一点吗? –

+0

@kimdecastro你可以发表该帖子中给出答案的执行时间比较吗?我很好奇哪一个是最快的。 –

0

指数3列将显示的结果非常快。

需要5秒钟来显示结果。

SELECT new.FIRSTNAME,new.MIDDLENAME,new.LASTNAME 
FROM newlist as new 
INNER JOIN recordlist as bgc ON new.FIRSTNAME = bgc.FIRSTNAME 
AND new.MIDDLENAME = bgc.MIDDLENAME AND new.LASTNAME = bgc.LASTNAME";