2012-09-03 96 views
0

我已經按照教程在tizag上爲MAX()mysql函數寫了下面的查詢,這正是我所需要的。唯一的麻煩是我需要將它加入到兩個表中,這樣我就可以處理所需的所有行。mysql max查詢然後JOIN?

$query = "SELECT idproducts, MAX(date) FROM results GROUP BY idproducts ORDER BY MAX(date) DESC"; 

下面我有此查詢,它具有JOIN我需要和工作原理:

 $query =  ("SELECT * 
        FROM operators 
        JOIN products 
        ON operators.idoperators = products.idoperator JOIN results 
        ON products.idProducts = results.idproducts 
        ORDER BY drawndate DESC 
        LIMIT 20"); 

有人能告訴我如何合併從我的第二個查詢該接合元件上查詢?我是PHP和MySQL的新手,這是我第一次讀到我已經閱讀過的計算機語言,並努力嘗試讓這兩個查詢起作用,但我處於一堵磚牆。我不知道如何向JOIN元素添加到第一個查詢:(

可能有些善良的人採取一個福利局憐憫和幫助我嗎?

回答

0

嘗試此查詢。

SELECT 
    * 
FROM 
    operators 
    JOIN products 
     ON operators.idoperators = products.idoperator 
    JOIN 
    (
     SELECT 
      idproducts, 
      MAX(date) 
     FROM results 
     GROUP BY idproducts 
    ) AS t 
    ON products.idproducts = t.idproducts 
ORDER BY drawndate DESC 
LIMIT 20 
+0

謝謝。我認爲我有它的工作,非常感謝你!我在哪裏可以閱讀哪些內容解釋你所做的事情? – Dee1983

+0

您已經加入了所有運營商的分配產品。然後,您可以獲得每個產品最新日期的所有結果,並將其加入到分配的產品中。 – edze

+0

我必須刪除那一點才能使其工作。我非常感謝你! – Dee1983

0

JOIN的功能有些獨立於聚合函數,它們只是改變集合函數運行的中間結果集,我喜歡指向MySQL文檔的寫法,這些提示在SELECT syntax中使用術語「table_reference」,並且擴展了什麼這意味着在JOIN syntax。基本上,任何簡單的查詢有一個表格指定的可以簡單地將該表擴展爲完整的JOIN子句,並且查詢將以相同的基本方式運行,只需修改中間結果集即可。

我說「中間結果集」在這讓我明白的連接和聚合的心態暗示。瞭解MySQL建立最終結果的順序對於知道如何可靠地獲取所需結果至關重要。通常,它首先查看在'FROM'之後指定的第一個表的第一行,並通過查看'WHERE'子句來決定它是否匹配。如果它不是立即可丟棄的,它會嘗試將該行加入到指定的第一個JOIN中,並重復「這會被WHERE丟棄嗎?」。對於所有JOIN,這些重複都會將行添加到結果集中,或者刪除它們,或者只留下一個,以適合您的JOIN,WHERE和數據。這個過程構建了我所說的「中間結果集」。在開始和完成完整查詢之間,MySQL在其內存中使用我剛描述的過程構建了一個潛在的巨大表格式數據結構。只有這樣,它纔會根據您的標準開始彙總(GROUP)結果。

因此,對於你的查詢,這取決於具體是什麼,你要去的(而不是在OP完全清楚)。如果您只是想從第二查詢MAX(日期),你可以簡單地認爲表達式添加到SELECT子句,然後添加一個聚集規範到最後:

SELECT *, MAX(date) 
FROM operators 
... 
GROUP BY idproducts 
ORDER BY ... 

或者,您可以添加的JOIN部分第二個查詢到第一個。

+1

'GROUP BY'和'SELECT *,MAX(date)'可能不適合初學者。如果使用這個,你應該知道你做了什麼。我有時候也會弄髒它,但最好將投影中處理過的所有列分組或使用聚合函數。 – edze

+0

同意,感謝您的評論。我其實很喜歡(在某種程度上),大多數其他RDBMS不允許聚合查詢選擇沒有聚合函數的列。 –

+0

但是對於MySQL來說,即使它很髒,性能有時也會更好;-) – edze