2013-05-09 49 views
1

我已經嘗試了幾個選項,我已經看到獲取GROUP BY和ORDER BY一起工作......但我無法得到正確的結果。排序方式desc和組通過跨表查詢

feeding_types table 
    id       
    type        
    quantity            
    feeding_id 

feedings table 
    id              
    data_entry_id 

查詢的基本組成部分返回如下:

 id  type  feeding_id 
     15236 dried_comm 13499 
     15237 dried_comm 13500 
     15286 dried_comm 13543 
     15287 dried_comm 13544 
     15294 tinned_comm 13550 
     15295 dried_comm 13551 
     15296 dried_comm 13552 

我想要做的就是使用GROUP BY擺脫這些結果的最新dried_comm和tinned_comm記錄,並過濾掉其餘的。

我已經試過這樣:

SELECT ft . * , MAX(ft.id) ID 
FROM feeding_types ft 
INNER JOIN feeding_types ft2 ON ft2.id = ft.ID 
JOIN feedings f1 ON ft.feeding_id = f1.id 
WHERE f1.data_entry_id = 15758 
GROUP BY ft.type 
ORDER BY ID DESC 

導致:

id  type  feeding_id ID 
15236 dried_comm 13499 15296 
15294 tinned_comm 13550 15294 

編輯:預期的結果將是 ID類型feeding_id ID 15296 dried_comm 13552 15296 15294 13550 tinned_comm 15294

任何想法如何讓這個工作正常?

+0

什麼值決定「最新的dried_comm和tinned_comm記錄」?你能否將預期的結果添加到問題中? – 2013-05-09 13:56:40

+0

只是每個人的最高ID,我已經在問題中添加了預期結果,歡呼 – bsod99 2013-05-09 13:59:46

回答

3

底層邏輯與您的實際算法不匹配。請允許我建議以下內容:

SELECT ft.* 
FROM feeding_types ft 
    JOIN (
     SELECT type, MAX(id) AS id 
     FROM feeding_types 
     GROUP BY type 
    ) t ON t.type = ft.type AND t.id = ft.id 
    JOIN feedings f1 ON ft.feeding_id = f1.id AND f1.data_entry_id = 15758 
+0

如果'feeding_types'表的PK是'id'列,那麼'ft'和'f'之間的連接條件可以被簡化:'ON t.id = ft.id'。 – 2013-05-09 14:02:48

+0

這是正確的,但我爲了清晰的目的保留它,因爲我不確定。 – Sebas 2013-05-09 14:03:44

+1

@Sebas - 完美的,只需要爲feeds_types子查詢添加一個別名,它工作的很好,謝謝 – bsod99 2013-05-09 14:17:49