2009-07-25 19 views
4

私はこの3つのテーブルのデータを取得するかなり複雑なクエリを持っていますが、今はもっと複雑にしたい(Oh dear)!最大値を除くすべてを選択する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をなぜ使用するのですか?(それをダミーにして、それを使用しないと仮定して)、ORDER BYのfeatures.postedOnだけではありませんか? – Stefan

+0

features.postedOnはサイトのコンテキストでは決して*使用されません。フォーマットされた文字列は 'posted'です。これは、さまざまなエントリの順序を維持するためのダミーの文字列なので、名前は 'ダミー'です( 'posted'によって順序付けすることは無意味な結果を返します)。 – different

答えて

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

+0

日付フィールドのフィルタリングは、一意であることが保証されていないため、おそらく良い考えではありません。同時に2つの投稿がある可能性があります。 idによるフィルタリングが優れています。 – Guss

+0

特集記事を掲載する頻度(1週間以内または1週間未満)は、私のサイトの頻度によっては問題にはなりません。とにかくありがとう。 :-) – different

0

あなたが持っている問題は、それはあなたがから最大(最新)の機能を見つける必要があるということですMAX()はグループ関数です。すべての行をグループ化して使用する必要があります。

あなたは最後の機能のIDを取得するために副選択を使用することができます。

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

このアプローチに問題がある - 副選択は、すべての行に対して実行されますが、それはその高価ではありません。

関連する問題