2014-06-16 100 views
1

我們正在做一些專業的骨骼工作,爲了一個好的原因,我有一個查詢的時間。許多志願者多年來一直在進行這種編碼,這是不可避免的結果。沒有得到我想要的加入

我有兩個表,A和B.我需要的是score_hours對兩個地方的數據僅用於A的每個實例獨特的之間的連接之

請記住,這兩個表格非常大(根據每月的時間,每個表格有10到50k +)。

表A:

  • ID(PK,AI)
  • UID(INT)
  • scores_date(時間戳(但出於某種原因,只有實際的日期,而不是 時間))
  • score_hours(十進制3,1)

表B:

  • ID(PK,AI)
  • UID(INT)
  • shift_date(時間戳)

有表B中多條記錄這是我們正在尋找的幾個日期(的的UID日期不是唯一的)。表A有多個uid記錄,但在不同日期。所以它每天可能有一天,但不是一天兩次。

這兩個表格顯然有更多的選擇器,但它們在表格之間沒有任何匹配(儘管我需要用簡單的「AND」來查詢它們),所以這是我必須處理的。由於查詢的其餘部分,我確實需要加入它們,但到目前爲止,我沒有在體面時間內獲得所需的記錄。

我的嘗試是:

這幾乎成了它。但是執行時間令人厭惡,並且因一些簡單的選擇器而失敗。

SELECT SUM(score_hours) 
FROM A 
WHERE 
A.uid IN 
(SELECT B.uid 
FROM B 
WHERE B.uid = "1") 

這給出了正確的輸出,但它爲每個uid的實例加入一個輸出。通常你可以通過分組來解決這個問題,但總和仍然會計算所有的數據。所以這不是一個選項:

SELECT SUM(score_hours) 
FROM A 
LEFT JOIN B ON A.uid = B.uid 
WHERE A.uid = "1" 

*編輯:我不僅需要加入的UID,但必須有這樣的事情在裏面:

DISTINCT(date(m.shift_datum)) = DATE(d.dagscores_date) 

這其實是一個很基本查詢,除了在關於左連接的記錄上需要一個SUM並且我需要同時在兩個表上加入的事實之外。

如果您需要更多數據,請告訴我。我可以提供所有。

+0

您可以添加一些示例數據和預期的輸出嗎?可以幫助澄清你想要達到什麼目的;-) – svvac

回答

0

您需要從要加入的表中刪除重複項,否則交叉產品將創建多個行,並將其添加到總和中。

SELECT SUM(score_hours) 
FROM A 
JOIN (SELECT DISTINCT uid 
     FROM B) AS B 
ON A.uid = B.uid 
+0

嗨巴爾馬,這不是你第一次幫我在這裏。我非常感激!您的查詢非常優雅,但似乎忘記了在查詢中提及某些內容。我將編輯該問題。 – Matt

+0

嗨巴爾馬,別介意。基於你的回答,我發現了我正在尋找的查詢。 「SELECT SUM(score_hours)FROM A JOIN(SELECT DISTINCT(DATE(shift_date)as datum,uid)as B on B.datum = A.scores_date WHERE A.uid = B.uid」 – Matt

+0

一般的觀點是一樣的 - 無論你加入什麼,都要在子查詢中加上'DISTINCT' – Barmar