2014-01-17 74 views
0

那麼,我研究並嘗試了多種方式(主要在這裏找到stackoverflow)後,我仍然沒有得到它的工作。只選擇連接表中的最大值與一些where子句

我有一個MySQL表像這樣(縮短,時間將是當然的時間戳):

id docid wardid version approved endingtime 
1 1  1  1  1 5 days 
2 1  1  2  1 20 days 
3 1  1  3  0 40 days 
4 2  2  1  0 30 days 
5 2  2  2  1 50 days 

和其他兩個表像name一些價值爲docidwardid

現在,它想要的是選擇所有行(只有一個docid條目),這些行沒有被批准,或者在特定的結束時間內,但只有最高版本的行。所以在這個例子中,我想只得到id爲3的行 這聽起來很簡單,因爲我寫這個,但我完全失去了。還不夠,我的白癡擦除了所有的嘗試(但最後):

SELECT MAX(dv.version), dv.docid, dv.id, dv.approved, dv.endingtime, d.name, w.name 
FROM (doc_versions as dv 
    LEFT JOIN docs as d ON d.id = dv.docid 
    LEFT JOIN wards as w ON w.id = d.wardid 
WHERE (approved < 1 AND ...) 
OR (dv.endingtime < $time AND ...) 
GROUP BY dv.docid 

希望你能幫助我。我認爲這是最糟糕的嘗試(這讓我昨天感到憤怒;))

編輯: 我最後一次嘗試似乎工作,必須嘗試一些。

SELECT v1.docs_id, v1.id as docversion, v1.approved, v1.approver, d.name as docname, w.name as wardname, d.wards_id as wardsid, v1.validity_endtime as deadline, v1.creator 
     FROM 
     (
      doc_versions v1 
      LEFT JOIN docs as d ON d.id = v1.docs_id 
      LEFT JOIN wards as w ON w.id = d.wards_id 
     ) 
     INNER JOIN 
     (
      SELECT MAX(version) version, docs_id 
      FROM doc_versions 
      GROUP BY docs_id 
     ) v2 
      ON v1.version = v2.version 
      AND v1.docs_id = v2.docs_id 
     WHERE (approved < 1 AND approver = ".$userid.($wardid > 0 ? ' AND wardsid = '.$wardid : '').") 
     OR (v1.validity_endtime < $time AND creator = ".$userid.($wardid > 0 ? ' AND wardsid = '.$wardid : '').")"; 

回答

0

像這樣的東西應該做的:

SELECT * 
FROM doc_versions dv1 
INNER JOIN (
    SELECT id, MAX(version) version 
     FROM doc_versions 
    WHERE (approved = 0 OR endingtime < $time ...) 
    GROUP BY id 
) dv2 ON dv1.id = dv2.id AND dv2.version = dv1.version 

在你建立與每個ID,最大有效版本的表子查詢;在外部查詢中,您將加入這兩個值的初始表。

+0

謝謝,這幾乎與我剛剛嘗試的相同,唯一的區別是我的WHERE子句不在內連接中。我會編輯我的帖子。謝謝你的幫助。必須檢查。 – lexith

+0

我只是試過,看看區別在哪裏。你的會給我一些不想要的結果。其實我想知道爲什麼,但不能再投入更多時間(目前)。我會按照這個。 – lexith