2016-04-18 10 views
0

私が作成したアプリケーションの場合、私はデータベースにある各ユーザーのために、先週(金曜日に月曜日)と毎日の詳細を取得する必要があります。Mysql - 'order by'句の後に 'having'句を使用できますか?

今のところ、私のクエリは毎月毎日(18日には18-17-16 ...など)、それ以前には私達は最初です...)

しかし、私は選択を最初の8日間に制限したいと思います。最後の例は、私がやろうとしているものです

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

:私はこれを読んで。しかし、問題は私が前にorder byをする必要があるということです。私は数ヶ月(DESC)から数日(DESC)まで注文する必要があり、私が望むものを得るにはhavingをする必要があります。私は注文せずにそれを試して、それはうまく動作しますが、それは間違った日を取得します。デフォルトではASCに整理されているためです。

ちょうど例えば、ここに私の問題を表すクエリだ、ここで私が持っているものです。

set @day := 0, @id:= ''; 

SELECT 
    day, id, @day := if(@id= id, @day + 1, 1) as day_number, 
    @id := id as dummy 
FROM 
    myTable 
WHERE 
    (month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 1 OR 
     month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 2) AND 
    year = EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AND 
    day <= EXTRACT(DAY FROM CURRENT_TIMESTAMP) 
ORDER BY 
    month DESC, 
    day DESC 
HAVING 
    day_number <= 8; 

しかし、私はHAVING後を置くことはできません。

SELECT 
    day, id 
FROM 
    myTable 
WHERE 
    (month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 1 OR 
     month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 2) AND 
    year = EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AND 
    day <= EXTRACT(DAY FROM CURRENT_TIMESTAMP) 
ORDER BY 
    month DESC, 
    day DESC; 

は、ここで私が欲しいものですORDER BYORDER BY句を削除すると、1日目と8日目の間にすべてのIDを取得できます。しかし、私は18と10の間に必要です。 (現在の日付の18日目)

アプリで使用しているコードでは、1週間後に停止するので、選択が日曜日を土曜日に戻すかどうかは関係ありません。少なくとも月曜日は金曜日。だから私はアプリがこの唯一の月曜日を実行するので、ナンバー '8'をとったのです。

ご協力いただきありがとうございます!

答えて

0

あなたはサブクエリでクエリをラップし、外部クエリでフィルタリングを行うことができます。

SET @day := 0, @id:= ''; 

SELECT day, id, day_number 
FROM (
    SELECT 
     day, id, 
     @day := IF(@id = id, @day + 1, 
        IF(@id := id, 1, 1)) as day_number 
    FROM 
     myTable 
    WHERE 
     month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 1 OR 
     month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 2) AND 
     year = EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AND 
     day <= EXTRACT(DAY FROM CURRENT_TIMESTAMP) 
    ORDER BY 
    month DESC, 
    day DESC) as t 
WHERE day_number <= 8; 

外側のクエリは、フィルタリングを実行するためにWHERE句を使用しています。 HAVINGは、GROUP BYと組み合わせて使用​​し、グループレベルの演算子です。

注:上記のクエリは、@id変数を正しく読み書きするためにネストされた条件を使用します。

+0

ありがとう、私はそれを試してみよう!私はサブクエリについて考えたことはありません! – anthomaxcool

+0

'day_number 'の計算方法が間違っている可能性はありますか?それは常に1を返します – anthomaxcool

+0

@anthomaxcool '@ id'または私のバージョンを設定するためにあなたのクエリを使用しましたか? –

関連する問題