2016-07-14 31 views
1

これはJoomlaデータベースクラスを使用していますが、うまくいけばうまくいきます。特定の日付範囲に応じて最大の日付と最小の日付を返す必要があります。私が抱えている問題は、これらの日付ごとにversion_idが必要なことです。私が書いた質問は、最大日付値のバージョンのみを返しています。私が最後にしたいのは、最小日付と最小日付値のバージョンIDと、最大日付と最大日付値のバージョンIDです。私はそれが組合のためのケースかもしれないと思うが、私はどのようにわからない。MYSQLのMAX MINの日付範囲

$query->select('a.ucm_type_id, a.ucm_item_id, a.version_id, MIN(a.save_date), MAX(a.save_date)') 
    ->from($db->quoteName('#__ucm_history') . ' AS a') 
    ->where('a.save_date BETWEEN ' . $db->quote($from_date) . ' AND ' . $db->quote($to_date)) 
    ->where('a.ucm_type_id IN (' . implode(',',$db->quote($content_type_ids)) . ')') 
    ->group(array('a.ucm_type_id', 'a.ucm_item_id',)); 
    // Join over the users for the checked out user. 
    $query->select('b.type_title AS type') 
    ->join('LEFT', '#__content_types AS b ON b.type_id=a.ucm_type_id'); 

    $db->setQuery($query); 
+0

最初にクエリを抽出します。その後、joomlaに合うように再エンジニアリングする方法について心配してください – Strawberry

+0

それは私の計画だった、そこに書かれたクエリはJoomlaで動作しますが、それは正しいクエリではありません。それは私が助けを必要とするものです。 –

答えて

2

version_idフィールドがucm_type_iducm_item_idに機能的に依存していた場合はあなたのクエリは、SQL標準に準拠しています。特定のSQLモード設定の下にあるMySQLでは、クエリが通過するようになるため、version_idの値は不定であるため、厄介な驚きを招く可能性があります。 Fortunatley、最近のmysqlバージョンでは、このモードはデフォルトではオフになっています。

サブクエリ内の日付範囲内の最大および最小の日付を取得し、これらの日付に関連付けられた他のフィールドを取得するには、元のテーブルにこれを戻す必要があります。

SQLのクエリは、次のようにSGになります:

select a.ucm_type_id, 
     a.ucm_item_id, 
     a.version_id, 
     a.save_date, 
     if(a.save_date=t1.min_save_date, 'min','max') as min_or_max, 
     b.type_title AS type 
from `#__ucm_history` a 
inner join 
    (select `ucm_type_id`, `ucm_item_id`, MIN(save_date) as min_save_date, MAX(save_date) as max_save_date 
    from `#__ucm_history` 
    where ucm_type_id IN (...) 
      and save_date BETWEEN ... and ... 
    group by `ucm_type_id`, `ucm_item_id` 
    ) t1 on a.ucm_type_id=t1.ucm_type_id and a.ucm_item_id=t1.ucm_item_id 
left join `#__content_types` AS b ON b.type_id=a.ucm_type_id 
where a.save_date=t1.min_save_date or a.save_date=t1.max_save_date 

は、PHPコードから、あなたのパラメータを持つ...セクションを交換してください。

SQL環境でクエリをテストして微調整し、満足したらORMツールを使用して実装します。しかし、私の推測では、生のSQL文として実行する必要があります。

+0

これは完璧にあなたに感謝します!もう1つの質問があります。最大値と最小値だけがあれば返すことが可能ですか?同じucm_typeとucm_idを共有する2つのversion_idがある場合 –

+1

ucm_type_idとucm_item_idのペアに少なくとも1つのレコードがある場合は、最大と最小の両方のレコードを持ちます。最大値と最小値は同じかもしれませんが、両方ともそこに存在するか、またはどちらも存在しません。 – Shadow

+0

申し訳ありませんが、私はそれをとてもうまく説明しませんでした。ucm_type_id、ucm_item_id、min_version_id、max_version_id、min_save_date、max_save_dateを使用して同じオブジェクトに読み込むことは可能ですか? –