2017-05-29 4 views
2

最後の一致より前の10日からすべての行を取得しようとしていますproperty_idDATE_SUB()とMIN()の問題

以下のクエリは、私が思い付いたものですが、HAVEINGの部分が機能していません。

SELECT * 

FROM tab t 

WHERE t.property_id=1 
GROUP BY t.property_id 
HAVING t.creation_date BETWEEN DATE_SUB(MIN(t.creation_date), INTERVAL 10 DAY) AND MIN(t.creation_date) 

ORDER BY t.creation_date DESC 

それは日付をチェックせずPROPERTY_IDに一致するすべての行を返します。最初は私がHAVINGが無視されたと思っていましたが、いくつかのテストの後で、私はそのエラーが本当にその行の中にあることに気付きました。

私は私のクエリを変更することで見ることができたとして、以下のテストが完全に働いた:

HAVING t.creation_date BETWEEN DATE_SUB('2017-05-29 00:00:00', INTERVAL 10 DAY) AND '2017-05-29 00:00:00' 

をこの1あまりにも:

HAVING t.creation_date BETWEEN DATE_SUB('2017-05-29 00:00:00', INTERVAL 10 DAY) AND MIN(t.creation_date) 

ではなく、これを:

HAVING t.creation_date BETWEEN DATE_SUB(MIN(t.creation_date), INTERVAL 10 DAY) AND '2017-05-29 00:00:00' 

ので、結論として、私は部分を作ると思う。HAVING encoun TERSのトラブルがある:

DATE_SUB(MIN(t.creation_date), INTERVAL 10 DAY) 
  • どのようにその部分は私がは役に立たないHAVING作ることができますか?
  • なぜ私はDATE_SUB()とMIN()を一緒に使うことができないのでしょうか?
  • もしそうなら、その制限をバイパスする方法はありますか?

    SELECT * 
    
        FROM table t 
    
        INNER JOIN 
        (
         SELECT MAX(creation_date) AS early_date 
    
          FROM table t 
          WHERE t.property_id=1 
    
        ) AS sub 
    
        WHERE t.property_id= 1 AND t.creation_date BETWEEN DATE_SUB(sub.early_date, INTERVAL 60 DAY) AND sub.early_date 
    

    I:

EDITその答えは

まあscaisEdgeの答え以下

、そして私の部分からの変更のビットは、私にとって理想的なMySQLのコードは以下のとおりです。まだであるような行動を取っていた理由を理解するにはまだ何らかの問題があります。

答えて

1

これはとにかくあなたがこの方法で

を試すことができ、データに何らかの問題が発生しているのだろう主に提案

です。このクエリは持っ使用し、かつ、それが動作していないだけ

select * 
FROM tab t 
inner join (
    select DATE_SUB(MIN(t.creation_date), INTERVAL 10 DAY) as min_min , 
        MIN(t.creation_date) as min_max 
    FROM tab t 
    WHERE t.property_id=1 
) t2 on t.t.creation_date between t2.min_min and t2.min_max 
WHERE t.property_id=1 
+0

残念ながら、事前計算された値の間で使用していない、それはt.propertyまたはBETWEENを確認せず、私のすべての行を取得します。 – DuffautM

+0

creation_date列はどのような種類のデータですか? – scaisEdge

+0

タイムスタンプの列 – DuffautM