2017-07-19 2 views
-1

私は請求システムを持っており、時間を過ごしてレポートを生成しようとしています。私は注文の変更のすべてのインスタンスを保存しているので、すべての請求書のほぼすべてのアイテムに対して複数のエントリがあります。このため、私は古い変更を除外し、最新のものだけを使用しようとしています。最新の作成日をグループ明細書で使用します

project_id、phase_id、および同じweekstartを共有する各インスタンスは、請求書の同じ項目です。私はレポートを生成し、それらのアイテムの最新バージョンを取得するだけです。

例テーブル:

id  project_id  phase_id  weekstart  created 
    --------------------------------------------------------------- 
    1  6    apple   2017-04-20 2017-04-23 
    2  6    apple   2017-04-20 2017-04-24 
    3  8    banana  2017-04-20 2017-04-23 
    4  9    pear   2017-04-20 2017-04-23 
    5  9    pear   2017-04-20 2017-04-25 

私が取得するクエリを実行できるようにしたい:

id  project_id  phase_id  weekstart  created 
    --------------------------------------------------------------- 
    2  6    apple   2017-04-20 2017-04-24 
    3  8    banana  2017-04-20 2017-04-23 
    5  9    pear   2017-04-20 2017-04-25 

現在、私のようなもの使用しています:

SELECT * from invoiceitems where employee_id = 10 
group by project_id, phase_id, weekstart 

をしかし、この作成日は考慮されません。

結果を注文しても、group byステートメントには影響しません。私は同様の投稿をチェックしましたが、見つかったのは2つのみで、作成日数が最も高い順に並べ替えるか、複数の列で結果をグループ化していません。

+0

あなたが使用しているクエリの結果を投稿することができます動作しますか? – Bdloul

+0

'SELECT *'は 'GROUP BY'クエリの有効な' SELECT'節ではありません。 'GROUP BY'クエリはテーブルから行を返しません** **レコードセットに置く行を即座に**生成します。生成された行ごとに、クエリから抽出された行のグループを使用します。グループ内の 'id'には複数の値があります(' id'は 'GROUP BY'節にないので)、' SELECT'節の 'id'があいまいです。 'GROUP BY'クエリ**はあなたの質問に対する解決策ではありません。 – axiac

+1

@axiacこれは、氷山の先端の一種です。 –

答えて

1

各プロジェクトの最新の作成時間を検出するサブクエリに結合します。ここではGROUP BYを使用していますが、サブクエリでのみ使用することに注意してください。

SELECT t1.* 
FROM invoiceitems t1 
INNER JOIN 
(
    SELECT project_id, phase_id, MAX(created) AS max_created 
    FROM invoiceitems 
    GROUP BY project_id 
) t2 
    ON t1.project_id = t2.project_id AND 
     t1.phase_id = t2.phase_id 
     t1.created = t2.max_created 
+0

I * think * 'phase'も考慮する必要があります – Strawberry

+0

@Strawberryあなたは正しいかもしれませんが、提供されたサンプルデータがこれを明らかにしていないとすれば、OPがあなたの勘を確認するコメントを残さない限り。 –

+0

phase_idを含める必要があります。週間スタートです。 3つすべてをグループ化することはできますか? –

-2

テストおよび完全

SELECT MAX(`id`) as `id`, `project_id`, `phase_id`, 
`weekstart`, MAX(`created`) as `created` 
FROM `invoiceitems` 
GROUP BY `project_id` 
ORDER BY `project_id` ASC 
+0

'MAX(id)'と 'MAX(created)'が元のテーブルの同じ行にある値を返すことを保証するものは何もありません。また 'GROUP BY project_id'と' phase_id'を選択したときに、同じ 'project_id'を持つが' phase_id'が異なる2つの行がある場合、サーバーは 'phase_id'に必要な値を自由に選択できます(https ://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html)。あなたの質問の結果は不確定です。 – axiac

+0

質問によると、私は 'id'は自動インクリメント列で、おそらく最新の' created'日付は 'id'が高くなります –

+0

また、私は' project_id'と'phase_id'はそれらの間にいくつかの関係を持っています。なぜなら、6がリンゴに、6が両方とも梨のためです。 –

関連する問題