2013-11-01 47 views
2

我有很多表,我試圖從一個查詢中拉出其中的很多數據。我已經制定了如何成功使用LEFT JOIN從其他表中獲取具有公共ID的相關數據。SQL:查詢幾個表,只有一個最新的結果,並從另一個的所有結果

使用此查詢,我試圖爲我們的ASSOCIATES_BACKGROUND_DATA表中的每個聯繫人獲取數據。

首先,我正在嘗試在ASSOCIATES_1_TO_1S.DATE_OF_MEETING(它存儲爲時間戳,因此只查找最大的時間戳)中找到他們最近的會議 - 我沒有得到正確的結果,我是否使用MAX函數是否正確?其次,我想要得到ASSOCIATE_IDASSOCIATES_ACTION_STEPS中的所有記錄。正確的加入似乎並沒有在這兩方面拉?

任何人都可以幫忙嗎?感覺我很接近爲此獲得結果,但這真的讓我感到困擾!

SELECT *, 
     ASSOCIATES_BACKGROUND_DATA.ASSOCIATE_ID as ABG_ASSOCIATE_ID, 
      ASSOCIATES_BACKGROUND_DATA.NAME_KNOWN_AS as ABG_NAME_KNOWN_AS, 
     ASSOCIATES_BACKGROUND_DATA.LAST_NAME as ABG_LAST_NAME, 
     USERS.NAME_KNOWN_AS as USERS_NAME_KNOWN_AS, 
     USERS.LAST_NAME as USERS_LAST_NAME, 
     MAX(ASSOCIATES_1_TO_1S.DATE_OF_MEETING) 
    FROM ASSOCIATES_BACKGROUND_DATA 
LEFT JOIN ASSOCIATES_1_TO_1S 
     ON ASSOCIATES_BACKGROUND_DATA.ASSOCIATE_ID = ASSOCIATES_1_TO_1S.ASSOCIATE_ID 
LEFT JOIN LIST_OF_UNIVERSITIES 
     ON ASSOCIATES_BACKGROUND_DATA.UNIVERSITY = LIST_OF_UNIVERSITIES.ID 
LEFT JOIN USERS 
     ON ASSOCIATES_BACKGROUND_DATA.PROGRAMME_COORDINATOR = USERS.ID 
RIGHT JOIN ASSOCIATES_ACTION_STEPS 
     ON ASSOCIATES_BACKGROUND_DATA.ASSOCIATE_ID = ASSOCIATES_ACTION_STEPS.ASSOCIATE_ID 
    GROUP BY ASSOCIATES_1_TO_1S.ASSOCIATE_ID 
    ORDER BY `ABG_NAME_KNOWN_AS` ASC 

提前任何幫助或指針,你可以給許多感謝...

+0

嗨@Sebas,是的,這是使用PHP來計算平均值,基於完成的操作步驟和截止日期之間的時間。 – user2751653

回答

3

我檢查你的查詢。對我來說,第一步是對其進行格式化以使其更易讀(如果花時間查詢,非常重要,不需要任何類型的開銷)。

在那之後,我回顧了邏輯,來到2個結論:

  • 你不需要右連接
  • 您的分組算法是不太正確的。

請看看這個查詢,並告訴我,如果有什麼東西丟失:

SELECT 
    abg.ASSOCIATE_ID as ABG_ASSOCIATE_ID, 
    abg.NAME_KNOWN_AS as ABG_NAME_KNOWN_AS, 
    abg.LAST_NAME as ABG_LAST_NAME, 
    u.NAME_KNOWN_AS as USERS_NAME_KNOWN_AS, 
    u.LAST_NAME as USERS_LAST_NAME, 
    t.lastmeeting 
FROM ASSOCIATES_BACKGROUND_DATA abg 
     LEFT JOIN (
      SELECT 
       abg.ASSOCIATE_ID as id, 
       MAX(a1s.DATE_OF_MEETING) AS lastmeeting 
      FROM ASSOCIATES_BACKGROUND_DATA abg 
       LEFT JOIN ASSOCIATES_1_TO_1S a1s ON abg.ASSOCIATE_ID = a1s.ASSOCIATE_ID 
      GROUP BY abg.ASSOCIATE_ID 
      ) t ON t.id = abg.ASSOCIATE_ID 
     LEFT JOIN ASSOCIATES_ACTION_STEPS aas ON abg.ASSOCIATE_ID = aas.ASSOCIATE_ID 
     LEFT JOIN USERS u ON abg.PROGRAMME_COORDINATOR = u.ID 
ORDER BY abg.NAME_KNOWN_AS 

我儘量不使用mysql的放縱中關於其group by函數(MySQL允許你脫身並不包括所有選定的領域),並堅持標準。但是,有必要爲每個關聯者預先計算MAX(DATE),然後將其與主記錄集合一起進行子查詢(請參閱t別名)。

乾杯。 PS:你可以再次加入與大學的聯繫,我跳過它只隔離問題。

PPS:以反映您的意見,我建立了這個查詢:

SELECT 
    abg.ASSOCIATE_ID as ABG_ASSOCIATE_ID, 
    abg.NAME_KNOWN_AS as ABG_NAME_KNOWN_AS, 
    abg.LAST_NAME as ABG_LAST_NAME, 
    u.NAME_KNOWN_AS as USERS_NAME_KNOWN_AS, 
    u.LAST_NAME as USERS_LAST_NAME, 
    t.lastmeeting, 
    t2.av AS averagetimedue 
FROM ASSOCIATES_BACKGROUND_DATA abg 
     LEFT JOIN (
      SELECT 
       abg.ASSOCIATE_ID as id, 
       MAX(a1s.DATE_OF_MEETING) AS lastmeeting 
      FROM ASSOCIATES_BACKGROUND_DATA abg 
       LEFT JOIN ASSOCIATES_1_TO_1S a1s ON abg.ASSOCIATE_ID = a1s.ASSOCIATE_ID 
      GROUP BY abg.ASSOCIATE_ID 
      ) t ON t.id = abg.ASSOCIATE_ID 
     LEFT JOIN (
      SELECT 
       (AVG(DATE_DUE)+AVG(DATE_COMPLETED))/2 AS av, 
       ASSOCIATE_ID 
      FROM ASSOCIATES_ACTION_STEPS 
      GROUP BY ASSOCIATE_ID 
      ) t2 ON abg.ASSOCIATE_ID = t2.ASSOCIATE_ID 
     LEFT JOIN ASSOCIATES_ACTION_STEPS aas ON abg.ASSOCIATE_ID = aas.ASSOCIATE_ID 
     LEFT JOIN USERS u ON abg.PROGRAMME_COORDINATOR = u.ID 
ORDER BY abg.NAME_KNOWN_AS 

我不知道你的average time between DATE_DUE and DATE_COMPLETED定義雖然。

+0

+1重新格式化 – Strawberry

+0

非常感謝@Sebas,這真的太棒了!您知道是否可以在「操作」步驟表中的每個Associate ID的所有結果中獲得DATE_DUE和DATE_COMPLETED之間的平均時間?或者我應該這樣做與PHP?真的需要爲這種類型的東西學習更多的SQL!再次感謝您的幫助,非常感謝:-) – user2751653

+0

嗨@Sebas,再次感謝您的額外查詢!我不確定它是否確實符合我們的要求。有沒有辦法與您聯繫以獲得自由職業者的幫助?還有一些額外的事情,我們想要從這個查詢拉... – user2751653

相關問題