2017-07-19 54 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 

但這沒有考慮到創建日期。

對結果排序並不會影響組合語句。我檢查過類似的帖子,但只有兩個我發現完全按照最高創建日期排序,或者沒有將結果按多列分組。

+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

我認爲*'階段'也需要考慮 – Strawberry

+0

@Strawberry你可能是對的,但鑑於提供的樣本數據似乎沒有透露這一點,我不會改變我的查詢,除非OP留下評論確認你的預感。 –

+0

需要包含phase_id。以及weekstart。 我可以在所有三個上分組嗎? –

-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(創建)'返回原始表上同一行的值。另外,如果你有'GROUP BY project_id'和'SELECT phase_id',如果有兩行具有相同的'project_id'但不同的'phase_id',服務器[可以自由選擇'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是蘋果和9是梨。 –