2011-05-19 65 views
0

我們有一個「交易」表,它記錄了我們網站上發生的各種事件。特別需要每晚進行一次「清理」過程。這裏是我的專欄(簡體):mysql查詢基於不同的鍵和時間戳檢索行

id, txName, brandName, visitorID, txDate 

這是我想要檢索(散文)什麼:

vistiorID's那些沒有記錄在過去是一個 「讀」 txName 「READ」 txName's 6周(根據txDate)爲特定的brandNamevisitorID完全有可能(並且可能)在6周窗口期間對於多於一個brandName具有「讀取」txName's。我們只有5 brandName's,所以我完全滿意地構建了一個單一的brandName的過程並重復5次。

我的大腦只能做2次MySQL SELECT查詢(6周之前的記錄,6周內的記錄),然後循環遍歷兩組以獲得一組最終記錄待處理。但我確信有一個WAAAAY更有效的方式,我只是不明白。

我希望這是有道理的...謝謝任何人可以幫助。我認爲這是真正搞亂我的部分是試圖選擇的人誰沒有登錄交易,與那些誰

+0

你只是想選擇txDate超過6周前的任何記錄嗎? – Dan 2011-05-19 03:27:53

+0

很好的問題。我意識到我只需要每個visitorID(每個品牌名稱)的單個實例。並且我只需要一個特定類型的txName(該條目被稱爲「READ」,如果讓那些認爲單詞「READ」與閱讀該表有關的人感到困惑,那麼很抱歉)。 – 2011-05-19 03:32:05

回答

0

你可以嘗試這樣的:

SELECT DISTINCT(visitorID) 
    FROM transactions 
    WHERE txName = "READ" 
    AND txDate <= '$6weeksago' 
GROUP BY brandName 

哪裏$6weeksago是一個在PHP中創建的變量,表示以所需格式(not sure if it was a date or Unix timestamp)中斷6周的時間。

我沒有測試過這個,因爲我沒有桌子,但我認爲這是你以後的樣子!

+0

這將是我的兩個查詢中的第一個,如果我不能想出一個更有效的方法來做到這一點。第二個是「SELECT DISTINCT(visitorID)FROM transactions WHERE txName =」READ「AND txDate> ='$ 6weeksago'GROUP BY brandName」(換句話說,時間表的倒數)。然後我會比較這兩組記錄以排除這兩組中存在visitorID的記錄。但是這可以在一個查詢中完成嗎? – 2011-05-19 03:48:55

+0

我想不起來:(就像你,我可能會把兩個查詢都放到數組中並進行比較),但是,可以使用php的array_key_exists函數在循環中獲得一些效率,並避免循環第二個數組對於第一個數組中的每個鍵,您只需循環訪問Array1,然後檢查Array2中是否存在相同的鍵,因此它應該避免需要循環多次... – Dan 2011-05-19 04:11:37