2014-05-21 67 views
-1

我有以下表格:困惑如何正確JOIN

  • 日誌 - 存儲每次互動的信息。 clickID(唯一)和businessID(不唯一)上的索引。
  • 操作 - 存儲有關客戶採取的每個特定操作的信息。 indexID,actionID,personID,businessID上的索引
  • customers - 存儲有關特定業務的每個特定客戶的信息。 personID和businessID上的索引(兩者都不是唯一的,但兩者的組合將會是)
  • people - 存儲關於每個作爲一個或多個企業的客戶的人的統計數據。 personID索引(唯一)。

我需要在一個結果集中獲取所有這些信息才能從中提取數據,以便我可以將交互連接到個人數據以及他們的業務特定數據。

我目前使用兩個數據集,我關聯在PHP中,但我寧願從一個返回的數據集工作,如果它是有道理的。

這裏是我當前的查詢集合:

SELECT * FROM `log` 
WHERE `timestamp` >= STARTTIME AND `timestamp` <= ENDTIME AND `pageID`='aPageID' AND `businessID`='aBusinessID' 
ORDER BY `timestamp` DESC 

SELECT * FROM `actions` AS `t1` 
INNER JOIN `people` AS `t2` ON (`t1.personID`=`t2.personID`) 
INNER JOIN `customers` AS `t2` ON (`t1.personID`=`t3.personID` AND `t1.businessID`=`t3.businessID`) 
WHERE `timestamp` >= STARTTIME AND `timestamp` <= ENDTIME AND `pageID`='aPageID' AND `businessID`='aBusinessID' 
ORDER BY `timestamp` DESC 

好像我最好能夠更好地與一個查詢,其中actionID(以及所有下面的結果)可能爲空,但我真的不知道看起來如何,或者它會如何影響性能。幫幫我?

+0

難道你不錯過一個企業表嗎? businessID指向什麼? –

+0

@FélixGagnon-Grenier有一個業務表,但它與這個查詢無關,對於這個查詢來說所有重要的事情都是關於擁有一個頁面的單個業務。我們知道這兩個值都會進入這個查詢。 –

回答

0
SELECT * FROM `log` AS t1 
INNER JOIN `actions` AS t2 ON (t1.`clickID`=t2.`clickID` AND t1.`businessID`=t2.`businessID`) 
INNER JOIN `customers` AS t3 ON (t1.`businessID`=t3.`BusinessID` AND t2.`personID`=t3.`personID`) 
INNER JOIN `people` AS t4 ON (t2.`personID`=t4.`personID`) 
WHERE `timestamp` >= STARTTIME AND `timestamp` <= ENDTIME AND `pageID`='aPageID' AND `businessID`='aBusinessID' 
ORDER BY `timestamp` DESC 
+0

我對此有點困惑。每個人都可以有很多匹配的客戶行和很多操作,但在這種情況下,只有一組匹配查詢。 WHERE語句的所有相關數據都在日誌表中,所以我不應該從那裏開始,是查詢中最具體的表? –

+0

你可以發佈所需結果的樣本嗎? –

+0

我有大量的列會讓這個模擬變得非常困難,但實質上,我希望所有來自'log'的匹配記錄。如果'actions'中的條目與'log'中的clickID匹配,我希望追加來自'actions'的匹配列,否則,我希望這些列爲空。在'people'裏有一個personID與'actions'中的personID匹配的條目,我希望這些列被追加,否則爲空。在'customers'中有一個條目,其中personID和userID與'actions'中的personID和userID匹配,我想添加這些列。 –