2016-04-15 58 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";