2013-05-11 28 views
1

我有一個表(netStream),有2個外鍵:(logSessions_logSessionID)和(accountSessions_accountSessionID)。MySQL的INSERT-SELECT非強制性場JOIN

logSessions_logSessionID)是強制性的(accountSessions_accountSessionID)不是強制性的。

這裏是塊方案的一部分,顯示了連接和非強制性狀態:

enter image description here

(背景:logSessions是每個訪問者具有會話,accountSessions是登錄會話。每個人都有一個logSession(因爲大家都是訪問者),但不是每個人都被記錄在,所以他們沒有accountSession

我想插入行(netStream),在任何情況下有一個(logSession),但與(accountSession)不一樣。所以,如果有(accountSession),我想要插入該ID,如果沒有(accountSession),那麼只需將該字段留在(netStream)NULL。

散列值存儲在Binary(x)中,這就是爲什麼我使用UNHEX()

這是我寫的MySQL,沒有錯誤信息,但它不起作用。問題是什麼?

INSERT INTO `test-db`.`netStream` (`netStreamHash`, `logSessions_logSessionID`, `accountSessions_accountSessionID`) 
    SELECT UNHEX("1faab"), `logSessions`.`logSessionID`, NULL FROM `logSessions` CROSS JOIN `accountSessions` 
     WHERE `logSessions`.`logSessionHash` = UNHEX("aac") AND 
     `accountSessions`.`accountSessionHash` = UNHEX("2fb"); 

回答

0

如果理解你正確,您可能正在這樣的事情

INSERT INTO `test-db`.`netStream` (
    `netStreamHash`, 
    `logSessions_logSessionID`, 
    `accountSessions_accountSessionID`) 
SELECT UNHEX("1faab"), 
     (SELECT `logSessionID` FROM `logSessions` 
     WHERE `logSessionHash` = UNHEX("aac")), 
     (SELECT `accountSessionID` FROM `accountSessions` 
     WHERE `accountSessionHash` = UNHEX("2fb")); 

如果在accountSessions沒有匹配的行,那麼你會得到NULLnetStream

插入 accountSessions_accountSessionID
+0

謝謝,這是工作。我想知道這個表現。一個INSERT中的兩個SELECT與JOIN具有相同的性能嗎? – 2013-05-11 01:17:24

+0

@ÁgotaHorváth不客氣。在那個特殊情況下,恕我直言,它沒有性能影響。對於要加入的數據集,必須首先選擇它們。 – peterm 2013-05-11 01:26:22