2009-07-25 130 views
4

我有這個相當複雜的查詢來抓取三張表中的數據,現在我希望它變得更加複雜(哦,親愛的)!SQL查詢選擇除最大值以外的所有內容

我想最後發佈的功能顯示在它自己的頁面部分,這很容易通過選擇表中的最後一項。但是,對於複雜的查詢(網站的主頁),我希望能夠不顯示此功能。

我想union以下查詢到我以前的查詢,但它沒有返回正確的結果:

SELECT 
    features.featureTitle AS title, 
    features.featureSummary AS body, 
    features.postedOn AS dummy, 
    DATE_FORMAT(features.postedOn, '%M %d, %Y') AS posted, 
    NULL, 
    NULL, 
    staff.staffName, 
    features.featureID 
FROM 
    features 
    LEFT JOIN staff ON 
     features.staffID = staff.staffID 
WHERE features.postedOn != MAX(features.postedOn) 
ORDER BY dummy DESC LIMIT 0,15 

此查詢將返回以下錯誤:

MySQL error: #1111 - Invalid use of group function

是有沒有辦法解決這個問題?

+0

爲什麼使用features.postedOn AS dummy(假設通過命名爲dummy,而不是使用它)而不僅僅是ORDER BY features.postedOn? – Stefan 2009-07-25 19:38:24

+0

features.postedOn永遠不會在網站上下文中使用*,它總是格式化的字符串'posted'。這是一個虛擬字符串,用於維護各種條目的順序,因此它的名稱爲'虛擬'(因爲'發佈'的順序會返回無意義的結果)。 – different 2009-08-05 16:18:38

回答

5

max查詢需要在自己的子查詢中,因此最終SQL應該是::

SELECT features.featureTitle AS title, 
    features.featureSummary AS body, 
    features.postedOn AS dummy, 
    DATE_FORMAT(features.postedOn, '%M %d, %Y') AS posted, 
    NULL, 
    NULL, 
    staff.staffName, 
    features.featureID 
FROM 
    features 
    LEFT JOIN staff ON 
     features.staffID = staff.staffID 
WHERE 
    features.postedOn != (select max(features.postedOn) from features) 
+1

你是明星。謝謝。 :-) – different 2009-07-25 19:20:14

+0

過濾日期字段可能不是一個好主意,因爲它不保證是唯一的 - 可能同時有兩個帖子。通過id過濾更好。 – Guss 2009-07-25 19:39:57

+0

鑑於我的網站發佈精選文章的頻率(一週或更少),這將是一個非問題。不管怎麼說,還是要謝謝你。 :-) – different 2009-07-25 20:12:25

0

你的是,問題是,你需要找到最大距離(最新)功能表,而遍歷每一行,但MAX()是一個組函數 - 你必須將所有行分組來使用它。

你可以使用子查詢來獲得最後一個特徵的ID:

WHERE featureId <> (SELECT featureId From features ORDER BY postedOn DESC LIMIT1) 

有這種方法的一個問題 - 子選擇運行的每一行,但它是不貴。