2012-06-14 92 views
0
SELECT * From `users` AS `User` 
LEFT JOIN `selections` AS `Selections` ON (`Selections`.`user_id` = `User`.`id`) 
LEFT JOIN `clients` AS `Client` ON (`Client`.`id` = `Selections`.`client_id`) 
LEFT JOIN `client_stats` AS `ClientsStat` ON (`ClientsStat`.`date` = """DATE1""") 

的事情是,我想在ClientsStat一些字段的值,其中日期=「DATE1」減去同一領域,但與日期#2,但我不當然,在左連接中我該怎麼做。我試着做一個其他的LEFT JOIN到同一個表並重命名它並減去,但執行時間非常高,所以我想我的方法很糟糕。從其減去2行的MySQL查詢LEFT JOIN

編輯:

我的結果是一樣的東西:

USER => fields... 
SELECTIONS => fields... 
CLIENTS => fields.. 
CLIENT_STATS => field x,y,z on date = date 1 

等。

我想這樣的:

USER => fields 
USERSELECTIONS => fields... 
CLIENTS => fields.. 
CLIENT_STATS => field x,y,z when client_stats.date = date1 MINUS field x,y,z when client_stats.date = date2 

+0

我完全不知道你在問什麼。 :-)你能編輯你的問題來提供一些示例數據並顯示你想從這些數據中獲得的輸出嗎?謝謝。 :-)等等;我可能擁有它。您是否正在尋找「ClientsStat.Date」等於「Date1」或「Date2」的行? –

+0

沒有。當date = date1時有信息,當date = date2時有其他信息。我想把它們放在一起! –

回答

1

你應該在統計數據上加倍加入。性能,我猜想是基於索引。然而,你確定你的意思是左連接(只在第一個表上需要,而不管第二個表上是否匹配)。或者...你的意思是一個內部聯接 - 你正在聯接的兩邊預測記錄。如果你想從一個記錄日期減去另一個記錄日期的值,我會期望找到兩個記錄。我寫作「JOIN」(雙方必須存在)而不是「LEFT JOIN」的基礎。

SELECT 
     U.* 
     CS1.x - CS2.x as XDiff, 
     CS1.y - CS2.y as YDiff, 
     CS1.z - CS2.z as ZDiff 
    From 
     users U 
     JOIN selections S 
      ON U.ID = S.User_ID 
      JOIN clients C 
       ON S.Client_ID = C.ID 
       JOIN client_stats CS1 
        ON (C.ID = CS1.Client_ID AND CS1.`date` = YourFirstDateVariable) 
       JOIN client_stats CS2 
        ON (C.ID = CS2.Client_ID AND CS2.`date` = YourSecondDateVariable) 

沒有絕對的把握,如果這就是你要找的人,但我認爲你錯過了一個元素是一個連接到客戶端統計上只是日期表...你沒有資格對哪些客戶端ID因此可能是您的表現失敗。確保client_Stats具有(client_id,date)上的索引 - 前提是這是client_id丟失的情況,並且是client_stats表的一部分。

+0

client_id沒有丟失,我只是將它從查詢中移除以簡化它。其實我有一個獨特的「ID」創建日期和id的混合,所以這種索引使它非常快速地找到具有精確的用戶ID和日期的行 –

+0

@讓 - 尼古拉斯,好的,但我做了什麼格式化出來可以幫助你找到可能缺失的東西?您是否正在通過提及用戶ID和特定活動日期來嘗試特定的單個用戶/客戶?我可能傾向於輕微的重組,但迄今還沒有足夠的信息。 – DRapp

+0

你說得對,現在表現還可以。非常感謝! –

0

第一: 你必須離開您的其他表之一,字段加入到client_stats。所以先讓連接正常工作。現在的方式 - 查詢是否運行? 第二: 然後,可以使用上的日期WHERE子句限制上ClientsStat.date的時間範圍:

WHERE ClientsStat.date> = '日期1' AND ClientsStat.date < = 'DATE2'

或類似的東西。

(可能需要查看有關表格的更多信息才能確切瞭解您正在嘗試執行的操作)。 作爲一般規則 - 讓查詢工作返回比您需要更多的行,然後工作 瞭解如何削減它們。